187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** @file 287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Cirrus Logic 5430 Controller Driver. 387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This driver is a sample implementation of the UGA Draw and Graphics Output 487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Protocols for the Cirrus Logic 5430 family of PCI video controllers. 587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This driver is only usable in the EFI pre-boot environment. 687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This sample is intended to show how the UGA Draw and Graphics output Protocol 794b73c2482a415da50c5b13c42753ac6f1548c07vanjeff is able to function. 887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang The UGA I/O Protocol is not implemented in this sample. 987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang A fully compliant EFI UGA driver requires both 1087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang the UGA Draw and the UGA I/O Protocol. Please refer to Microsoft's 1187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang documentation on UGA for details on how to write a UGA driver that is able 1287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang to function both in the EFI pre-boot environment and from the OS runtime. 1387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 14e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> 15ac1ca10416edf34b6700a31d0bc58d144e35974chhtian This program and the accompanying materials 1694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff are licensed and made available under the terms and conditions of the BSD License 1794b73c2482a415da50c5b13c42753ac6f1548c07vanjeff which accompanies this distribution. The full text of the license may be found at 1894b73c2482a415da50c5b13c42753ac6f1548c07vanjeff http://opensource.org/licenses/bsd-license.php 1987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 2094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 2194b73c2482a415da50c5b13c42753ac6f1548c07vanjeff WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 2287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 2387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 2487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 2587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 2687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// Cirrus Logic 5430 Controller Driver 2787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 2887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang#include "CirrusLogic5430.h" 2987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 3087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_DRIVER_BINDING_PROTOCOL gCirrusLogic5430DriverBinding = { 3187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverSupported, 3287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverStart, 3387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverStop, 3487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x10, 3587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL, 3687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL 3787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 3887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 3987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 4087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// Generic Attribute Controller Register Settings 4187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 4287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 AttributeController[21] = { 4394b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 4494b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 4587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x41, 0x00, 0x0F, 0x00, 0x00 4687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 4787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 4887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 4987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// Generic Graphics Controller Register Settings 5087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 5187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 GraphicsController[9] = { 5287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF 5387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 5487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 5587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 5687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 640 x 480 x 256 color @ 60 Hertz 5787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 5887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 Crtc_640_480_256_60[28] = { 5987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x5d, 0x4f, 0x50, 0x82, 0x53, 0x9f, 0x00, 0x3e, 6094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0xe1, 0x83, 0xdf, 0x50, 0x00, 0xe7, 0x04, 0xe3, 6287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0xff, 0x00, 0x00, 0x22 6387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 6487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 6587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT16 Seq_640_480_256_60[15] = { 6694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b, 6787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x5b0c, 0x450d, 0x7e0e, 0x2b1b, 0x2f1c, 0x301d, 0x331e 6887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 6987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 7087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 7187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 800 x 600 x 256 color @ 60 Hertz 7287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 7387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 Crtc_800_600_256_60[28] = { 7494b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x7F, 0x63, 0x64, 0x80, 0x6B, 0x1B, 0x72, 0xF0, 7594b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x58, 0x8C, 0x57, 0x64, 0x00, 0x5F, 0x91, 0xE3, 7787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0xFF, 0x00, 0x00, 0x22 7887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 7987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 8087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT16 Seq_800_600_256_60[15] = { 8194b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b, 8287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x5b0c, 0x450d, 0x510e, 0x2b1b, 0x2f1c, 0x301d, 0x3a1e 8387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 8487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 8587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 8687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 1024 x 768 x 256 color @ 60 Hertz 8787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang// 8887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 Crtc_1024_768_256_60[28] = { 8994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0xA3, 0x7F, 0x80, 0x86, 0x85, 0x96, 0x24, 0xFD, 9094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x02, 0x88, 0xFF, 0x80, 0x00, 0x00, 0x24, 0xE3, 9287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0xFF, 0x4A, 0x00, 0x22 9387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 9487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 9587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT16 Seq_1024_768_256_60[15] = { 9694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b, 9787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x5b0c, 0x450d, 0x760e, 0x2b1b, 0x2f1c, 0x301d, 0x341e 9887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 9987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 10087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 10187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// Table of supported video modes 10287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/// 10387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangCIRRUS_LOGIC_5430_VIDEO_MODES CirrusLogic5430VideoModes[] = { 10487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang { 640, 480, 8, 60, Crtc_640_480_256_60, Seq_640_480_256_60, 0xe3 }, 10594b73c2482a415da50c5b13c42753ac6f1548c07vanjeff { 800, 600, 8, 60, Crtc_800_600_256_60, Seq_800_600_256_60, 0xef }, 10694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff { 1024, 768, 8, 60, Crtc_1024_768_256_60, Seq_1024_768_256_60, 0xef } 10787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang}; 10887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 10931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff 11087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 11187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverSupported 11287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 11387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: This - add argument and description to function comment 11487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Controller - add argument and description to function comment 11587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: RemainingDevicePath - add argument and description to function comment 11687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 11787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_STATUS 11887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFIAPI 11987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangCirrusLogic5430ControllerDriverSupported ( 12087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 12187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_HANDLE Controller, 12287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 12387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 12487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 12587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_STATUS Status; 12687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_PCI_IO_PROTOCOL *PciIo; 12787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang PCI_TYPE00 Pci; 1286fe852082f747292ecdb51560f890eb6ac8036favanjeff EFI_DEV_PATH *Node; 12987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 13087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 13187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Open the PCI I/O Protocol 13287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 13387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->OpenProtocol ( 13487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 13587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiPciIoProtocolGuid, 13687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang (VOID **) &PciIo, 13787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 13887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 13987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_OPEN_PROTOCOL_BY_DRIVER 14087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 14187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 14287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 14387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 14487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 14587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 14687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Read the PCI Configuration Header from the PCI Device 14787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 14887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = PciIo->Pci.Read ( 14987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang PciIo, 15087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthUint32, 15187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0, 15287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang sizeof (Pci) / sizeof (UINT32), 15387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Pci 15487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 15587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 15687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang goto Done; 15787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 15887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 15987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = EFI_UNSUPPORTED; 16087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 16187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // See if the I/O enable is on. Most systems only allow one VGA device to be turned on 16287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // at a time, so see if this is one that is turned on. 16387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 16487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // if (((Pci.Hdr.Command & 0x01) == 0x01)) { 16587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 16687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // See if this is a Cirrus Logic PCI controller 16787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 16887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (Pci.Hdr.VendorId == CIRRUS_LOGIC_VENDOR_ID) { 16987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 17087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // See if this is a 5430 or a 5446 PCI controller 17187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 1726fe852082f747292ecdb51560f890eb6ac8036favanjeff if (Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_DEVICE_ID || 1736fe852082f747292ecdb51560f890eb6ac8036favanjeff Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID || 1746fe852082f747292ecdb51560f890eb6ac8036favanjeff Pci.Hdr.DeviceId == CIRRUS_LOGIC_5446_DEVICE_ID) { 1756fe852082f747292ecdb51560f890eb6ac8036favanjeff 17687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = EFI_SUCCESS; 1776fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1786fe852082f747292ecdb51560f890eb6ac8036favanjeff // If this is an Intel 945 graphics controller, 1796fe852082f747292ecdb51560f890eb6ac8036favanjeff // go further check RemainingDevicePath validation 1806fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1816fe852082f747292ecdb51560f890eb6ac8036favanjeff if (RemainingDevicePath != NULL) { 1826fe852082f747292ecdb51560f890eb6ac8036favanjeff Node = (EFI_DEV_PATH *) RemainingDevicePath; 1836fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1846fe852082f747292ecdb51560f890eb6ac8036favanjeff // Check if RemainingDevicePath is the End of Device Path Node, 1856fe852082f747292ecdb51560f890eb6ac8036favanjeff // if yes, return EFI_SUCCESS 1866fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1876fe852082f747292ecdb51560f890eb6ac8036favanjeff if (!IsDevicePathEnd (Node)) { 1886fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1896fe852082f747292ecdb51560f890eb6ac8036favanjeff // If RemainingDevicePath isn't the End of Device Path Node, 1906fe852082f747292ecdb51560f890eb6ac8036favanjeff // check its validation 1916fe852082f747292ecdb51560f890eb6ac8036favanjeff // 1926fe852082f747292ecdb51560f890eb6ac8036favanjeff if (Node->DevPath.Type != ACPI_DEVICE_PATH || 1936fe852082f747292ecdb51560f890eb6ac8036favanjeff Node->DevPath.SubType != ACPI_ADR_DP || 1946fe852082f747292ecdb51560f890eb6ac8036favanjeff DevicePathNodeLength(&Node->DevPath) != sizeof(ACPI_ADR_DEVICE_PATH)) { 1956fe852082f747292ecdb51560f890eb6ac8036favanjeff Status = EFI_UNSUPPORTED; 1966fe852082f747292ecdb51560f890eb6ac8036favanjeff } 1976fe852082f747292ecdb51560f890eb6ac8036favanjeff } 1986fe852082f747292ecdb51560f890eb6ac8036favanjeff } 19987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 20087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 20187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 20287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangDone: 20387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 20487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Close the PCI I/O Protocol 20587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 20687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang gBS->CloseProtocol ( 20787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 20887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiPciIoProtocolGuid, 20987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 21087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller 21187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 21287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 21387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 21487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 21587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 21687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 21787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverStart 21887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 21987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: This - add argument and description to function comment 22087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Controller - add argument and description to function comment 22187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: RemainingDevicePath - add argument and description to function comment 22287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 22387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_STATUS 22487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFIAPI 22587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangCirrusLogic5430ControllerDriverStart ( 22687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 22787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_HANDLE Controller, 22887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 22987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 23087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 23187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_STATUS Status; 23287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private; 2336a6d955c5f670141344c614c65dbea332f393b57vanjeff BOOLEAN PciAttributesSaved; 23431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; 23531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ACPI_ADR_DEVICE_PATH AcpiDeviceNode; 236e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun UINT64 Supports; 23787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 2386a6d955c5f670141344c614c65dbea332f393b57vanjeff PciAttributesSaved = FALSE; 23987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 24087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Allocate Private context data for UGA Draw inteface. 24187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 24287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private = AllocateZeroPool (sizeof (CIRRUS_LOGIC_5430_PRIVATE_DATA)); 24387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (Private == NULL) { 24487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = EFI_OUT_OF_RESOURCES; 24587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang goto Error; 24687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 24787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 24887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 24987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Set up context record 25087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 25187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->Signature = CIRRUS_LOGIC_5430_PRIVATE_DATA_SIGNATURE; 25231f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Private->Handle = NULL; 25387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 25487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 25587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Open PCI I/O Protocol 25687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 25787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->OpenProtocol ( 258d52be0e242223138773f6c9e185dc5d3463a2caejljusten Controller, 25987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiPciIoProtocolGuid, 26087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang (VOID **) &Private->PciIo, 26187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 262d52be0e242223138773f6c9e185dc5d3463a2caejljusten Controller, 26387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_OPEN_PROTOCOL_BY_DRIVER 26487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 26587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 26687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang goto Error; 26787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 26887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 26994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // 270e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun // Get supported PCI attributes 271e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun // 272e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Status = Private->PciIo->Attributes ( 273e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Private->PciIo, 274e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun EfiPciIoAttributeOperationSupported, 275e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun 0, 276e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun &Supports 277e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun ); 278e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun if (EFI_ERROR (Status)) { 279e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun goto Error; 280e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun } 281e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun 282e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Supports &= (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16); 283e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) { 284e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Status = EFI_UNSUPPORTED; 285e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun goto Error; 286e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun } 287e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun 288e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun // 28994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // Save original PCI attributes 29094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // 29194b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Status = Private->PciIo->Attributes ( 29294b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Private->PciIo, 29394b73c2482a415da50c5b13c42753ac6f1548c07vanjeff EfiPciIoAttributeOperationGet, 29494b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 0, 29594b73c2482a415da50c5b13c42753ac6f1548c07vanjeff &Private->OriginalPciAttributes 29694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff ); 29794b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 29894b73c2482a415da50c5b13c42753ac6f1548c07vanjeff if (EFI_ERROR (Status)) { 29994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff goto Error; 30094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff } 3016a6d955c5f670141344c614c65dbea332f393b57vanjeff PciAttributesSaved = TRUE; 30294b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 30387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = Private->PciIo->Attributes ( 304e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun Private->PciIo, 305e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun EfiPciIoAttributeOperationEnable, 306e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | Supports, 307e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun NULL 308e0ee9d9314c7c2816b89908a1fac871c911f1cb0rsun ); 30987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 31087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang goto Error; 31187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 31287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 31331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 31431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // Get ParentDevicePath 31531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 31631f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Status = gBS->HandleProtocol ( 31731f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Controller, 31831f9e631176ef02829edcb537ec5caf04026c3f2vanjeff &gEfiDevicePathProtocolGuid, 31931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff (VOID **) &ParentDevicePath 32031f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ); 32131f9e631176ef02829edcb537ec5caf04026c3f2vanjeff if (EFI_ERROR (Status)) { 32231f9e631176ef02829edcb537ec5caf04026c3f2vanjeff goto Error; 32331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } 32431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff 32531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff if (FeaturePcdGet (PcdSupportGop)) { 32631f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 32731f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // Set Gop Device Path 32831f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 32931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff if (RemainingDevicePath == NULL) { 33031f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH)); 33131f9e631176ef02829edcb537ec5caf04026c3f2vanjeff AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH; 33231f9e631176ef02829edcb537ec5caf04026c3f2vanjeff AcpiDeviceNode.Header.SubType = ACPI_ADR_DP; 33331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0); 33431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH)); 33531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff 33631f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Private->GopDevicePath = AppendDevicePathNode ( 33731f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ParentDevicePath, 33831f9e631176ef02829edcb537ec5caf04026c3f2vanjeff (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode 33931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ); 3406fe852082f747292ecdb51560f890eb6ac8036favanjeff } else if (!IsDevicePathEnd (RemainingDevicePath)) { 3416fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3426fe852082f747292ecdb51560f890eb6ac8036favanjeff // If RemainingDevicePath isn't the End of Device Path Node, 3436fe852082f747292ecdb51560f890eb6ac8036favanjeff // only scan the specified device by RemainingDevicePath 3446fe852082f747292ecdb51560f890eb6ac8036favanjeff // 34531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Private->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath); 3466fe852082f747292ecdb51560f890eb6ac8036favanjeff } else { 3476fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3486fe852082f747292ecdb51560f890eb6ac8036favanjeff // If RemainingDevicePath is the End of Device Path Node, 3496fe852082f747292ecdb51560f890eb6ac8036favanjeff // don't create child device and return EFI_SUCCESS 3506fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3516fe852082f747292ecdb51560f890eb6ac8036favanjeff Private->GopDevicePath = NULL; 3526fe852082f747292ecdb51560f890eb6ac8036favanjeff } 3536fe852082f747292ecdb51560f890eb6ac8036favanjeff 3546fe852082f747292ecdb51560f890eb6ac8036favanjeff if (Private->GopDevicePath != NULL) { 3556fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3566fe852082f747292ecdb51560f890eb6ac8036favanjeff // Creat child handle and device path protocol firstly 3576fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3586fe852082f747292ecdb51560f890eb6ac8036favanjeff Private->Handle = NULL; 3596fe852082f747292ecdb51560f890eb6ac8036favanjeff Status = gBS->InstallMultipleProtocolInterfaces ( 3606fe852082f747292ecdb51560f890eb6ac8036favanjeff &Private->Handle, 3616fe852082f747292ecdb51560f890eb6ac8036favanjeff &gEfiDevicePathProtocolGuid, 3626fe852082f747292ecdb51560f890eb6ac8036favanjeff Private->GopDevicePath, 3636fe852082f747292ecdb51560f890eb6ac8036favanjeff NULL 3646fe852082f747292ecdb51560f890eb6ac8036favanjeff ); 36531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } 36631f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } 36731f9e631176ef02829edcb537ec5caf04026c3f2vanjeff 36831f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 36931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // Construct video mode buffer 37031f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 37131f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Status = CirrusLogic5430VideoModeSetup (Private); 37231f9e631176ef02829edcb537ec5caf04026c3f2vanjeff if (EFI_ERROR (Status)) { 37331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff goto Error; 37431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } 37531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff 37687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (FeaturePcdGet (PcdSupportUga)) { 37787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 37887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Start the UGA Draw software stack. 37987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 38087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = CirrusLogic5430UgaDrawConstructor (Private); 38187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ASSERT_EFI_ERROR (Status); 38287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 38331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Private->UgaDevicePath = ParentDevicePath; 38431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Status = gBS->InstallMultipleProtocolInterfaces ( 38531f9e631176ef02829edcb537ec5caf04026c3f2vanjeff &Controller, 38631f9e631176ef02829edcb537ec5caf04026c3f2vanjeff &gEfiUgaDrawProtocolGuid, 38731f9e631176ef02829edcb537ec5caf04026c3f2vanjeff &Private->UgaDraw, 38831f9e631176ef02829edcb537ec5caf04026c3f2vanjeff &gEfiDevicePathProtocolGuid, 38931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Private->UgaDevicePath, 39031f9e631176ef02829edcb537ec5caf04026c3f2vanjeff NULL 39131f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ); 39287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 39331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } else if (FeaturePcdGet (PcdSupportGop)) { 3946fe852082f747292ecdb51560f890eb6ac8036favanjeff if (Private->GopDevicePath == NULL) { 3956fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3966fe852082f747292ecdb51560f890eb6ac8036favanjeff // If RemainingDevicePath is the End of Device Path Node, 3976fe852082f747292ecdb51560f890eb6ac8036favanjeff // don't create child device and return EFI_SUCCESS 3986fe852082f747292ecdb51560f890eb6ac8036favanjeff // 3996fe852082f747292ecdb51560f890eb6ac8036favanjeff Status = EFI_SUCCESS; 4006fe852082f747292ecdb51560f890eb6ac8036favanjeff } else { 4016fe852082f747292ecdb51560f890eb6ac8036favanjeff 4026fe852082f747292ecdb51560f890eb6ac8036favanjeff // 4036fe852082f747292ecdb51560f890eb6ac8036favanjeff // Start the GOP software stack. 4046fe852082f747292ecdb51560f890eb6ac8036favanjeff // 4056fe852082f747292ecdb51560f890eb6ac8036favanjeff Status = CirrusLogic5430GraphicsOutputConstructor (Private); 4066fe852082f747292ecdb51560f890eb6ac8036favanjeff ASSERT_EFI_ERROR (Status); 4076fe852082f747292ecdb51560f890eb6ac8036favanjeff 4086fe852082f747292ecdb51560f890eb6ac8036favanjeff Status = gBS->InstallMultipleProtocolInterfaces ( 4096fe852082f747292ecdb51560f890eb6ac8036favanjeff &Private->Handle, 4106fe852082f747292ecdb51560f890eb6ac8036favanjeff &gEfiGraphicsOutputProtocolGuid, 4116fe852082f747292ecdb51560f890eb6ac8036favanjeff &Private->GraphicsOutput, 4126fe852082f747292ecdb51560f890eb6ac8036favanjeff &gEfiEdidDiscoveredProtocolGuid, 4136fe852082f747292ecdb51560f890eb6ac8036favanjeff &Private->EdidDiscovered, 4146fe852082f747292ecdb51560f890eb6ac8036favanjeff &gEfiEdidActiveProtocolGuid, 4156fe852082f747292ecdb51560f890eb6ac8036favanjeff &Private->EdidActive, 4166fe852082f747292ecdb51560f890eb6ac8036favanjeff NULL 4176fe852082f747292ecdb51560f890eb6ac8036favanjeff ); 4186fe852082f747292ecdb51560f890eb6ac8036favanjeff } 41931f9e631176ef02829edcb537ec5caf04026c3f2vanjeff } else { 42031f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 42131f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // This driver must support eithor GOP or UGA or both. 42231f9e631176ef02829edcb537ec5caf04026c3f2vanjeff // 42331f9e631176ef02829edcb537ec5caf04026c3f2vanjeff ASSERT (FALSE); 42431f9e631176ef02829edcb537ec5caf04026c3f2vanjeff Status = EFI_UNSUPPORTED; 42587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 42694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff 42787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 42887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangError: 42987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 43087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (Private) { 43187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (Private->PciIo) { 4326a6d955c5f670141344c614c65dbea332f393b57vanjeff if (PciAttributesSaved == TRUE) { 4336a6d955c5f670141344c614c65dbea332f393b57vanjeff // 4346a6d955c5f670141344c614c65dbea332f393b57vanjeff // Restore original PCI attributes 4356a6d955c5f670141344c614c65dbea332f393b57vanjeff // 4366a6d955c5f670141344c614c65dbea332f393b57vanjeff Private->PciIo->Attributes ( 4376a6d955c5f670141344c614c65dbea332f393b57vanjeff Private->PciIo, 4386a6d955c5f670141344c614c65dbea332f393b57vanjeff EfiPciIoAttributeOperationSet, 4396a6d955c5f670141344c614c65dbea332f393b57vanjeff Private->OriginalPciAttributes, 4406a6d955c5f670141344c614c65dbea332f393b57vanjeff NULL 4416a6d955c5f670141344c614c65dbea332f393b57vanjeff ); 4426a6d955c5f670141344c614c65dbea332f393b57vanjeff } 44394b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // 44494b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // Close the PCI I/O Protocol 44594b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // 44694b73c2482a415da50c5b13c42753ac6f1548c07vanjeff gBS->CloseProtocol ( 44794b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Private->Handle, 44894b73c2482a415da50c5b13c42753ac6f1548c07vanjeff &gEfiPciIoProtocolGuid, 44994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff This->DriverBindingHandle, 45094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Private->Handle 45194b73c2482a415da50c5b13c42753ac6f1548c07vanjeff ); 45287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 45387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 45487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang gBS->FreePool (Private); 45587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 45687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 45787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 45887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 45987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 46087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 46187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 46287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430ControllerDriverStop 46387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 46487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: This - add argument and description to function comment 46587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Controller - add argument and description to function comment 46687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: NumberOfChildren - add argument and description to function comment 46787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: ChildHandleBuffer - add argument and description to function comment 46887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: EFI_SUCCESS - add return value to function comment 46987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 47087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_STATUS 47187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFIAPI 47287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangCirrusLogic5430ControllerDriverStop ( 47387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_DRIVER_BINDING_PROTOCOL *This, 47487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_HANDLE Controller, 47587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN UINTN NumberOfChildren, 47687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_HANDLE *ChildHandleBuffer 47787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 47887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 47987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_UGA_DRAW_PROTOCOL *UgaDraw; 48087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 48187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 48287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_STATUS Status; 48387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private; 48487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 48587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (FeaturePcdGet (PcdSupportUga)) { 48687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->OpenProtocol ( 48787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 48887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiUgaDrawProtocolGuid, 48987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang (VOID **) &UgaDraw, 49087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 49187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 49287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_OPEN_PROTOCOL_GET_PROTOCOL 49387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 49487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 49587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 49687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 49787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 49887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Get our private context information 49987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 50087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_UGA_DRAW_THIS (UgaDraw); 50187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430UgaDrawDestructor (Private); 50287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 50387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (FeaturePcdGet (PcdSupportGop)) { 50487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430GraphicsOutputDestructor (Private); 50587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 50687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Remove the UGA and GOP protocol interface from the system 50787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 50887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->UninstallMultipleProtocolInterfaces ( 50987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->Handle, 51087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiUgaDrawProtocolGuid, 51187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Private->UgaDraw, 51287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiGraphicsOutputProtocolGuid, 51387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Private->GraphicsOutput, 51487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL 51587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 51687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } else { 51787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 51887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Remove the UGA Draw interface from the system 51987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 52087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->UninstallMultipleProtocolInterfaces ( 52187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->Handle, 52287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiUgaDrawProtocolGuid, 52387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Private->UgaDraw, 52487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL 52587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 52687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 52787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } else { 52887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->OpenProtocol ( 52987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 53087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiGraphicsOutputProtocolGuid, 53187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang (VOID **) &GraphicsOutput, 53287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 53387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 53487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_OPEN_PROTOCOL_GET_PROTOCOL 53587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 53687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 53787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 53887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 53987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 54087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 54187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Get our private context information 54287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 54387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput); 54487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 54587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430GraphicsOutputDestructor (Private); 54687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 54787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Remove the GOP protocol interface from the system 54887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 54987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->UninstallMultipleProtocolInterfaces ( 55087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->Handle, 55187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiUgaDrawProtocolGuid, 55287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Private->UgaDraw, 55387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiGraphicsOutputProtocolGuid, 55487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Private->GraphicsOutput, 55587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL 55687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 55787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 55887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 55987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang if (EFI_ERROR (Status)) { 56087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 56187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 56287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 56387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 56494b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // Restore original PCI attributes 56587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 56687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Attributes ( 56794b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Private->PciIo, 56894b73c2482a415da50c5b13c42753ac6f1548c07vanjeff EfiPciIoAttributeOperationSet, 56994b73c2482a415da50c5b13c42753ac6f1548c07vanjeff Private->OriginalPciAttributes, 57094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff NULL 57194b73c2482a415da50c5b13c42753ac6f1548c07vanjeff ); 57287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 57387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 57487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Close the PCI I/O Protocol 57587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 57687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang gBS->CloseProtocol ( 57787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller, 57887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiPciIoProtocolGuid, 57987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang This->DriverBindingHandle, 58087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Controller 58187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 58287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 58387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 58487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // Free our instance data 58587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 58687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang gBS->FreePool (Private); 58787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 58887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return EFI_SUCCESS; 58987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 59087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 59187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 59287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CirrusLogic5430UgaDrawDestructor 59387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 59487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Private - add argument and description to function comment 59587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: EFI_SUCCESS - add return value to function comment 59687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 59787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_STATUS 59887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangCirrusLogic5430UgaDrawDestructor ( 59987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private 60087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 60187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 60287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return EFI_SUCCESS; 60387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 60487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 60587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 60687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 60787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 60887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 60987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Address TODO: add argument description 61087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Data TODO: add argument description 61187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 61287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 61387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 61487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 61587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 61687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangoutb ( 61787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 61887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Address, 61987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Data 62087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 62187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 62287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Io.Write ( 62387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo, 62487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthUint8, 62587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_PCI_IO_PASS_THROUGH_BAR, 62687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Address, 62787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 1, 62887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Data 62987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 63087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 63187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 63287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 63387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 63487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 63587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 63687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Address TODO: add argument description 63787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Data TODO: add argument description 63887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 63987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 64087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 64187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 64287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 64387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangoutw ( 64487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 64587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Address, 64687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT16 Data 64787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 64887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 64987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Io.Write ( 65087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo, 65187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthUint16, 65287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_PCI_IO_PASS_THROUGH_BAR, 65387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Address, 65487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 1, 65587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Data 65687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 65787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 65887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 65987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 66087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 66187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 66287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 66387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Address TODO: add argument description 66487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 66587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 66687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 66787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 66887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT8 66987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuanginb ( 67087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 67187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Address 67287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 67387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 67487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Data; 67587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 67687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Io.Read ( 67787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo, 67887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthUint8, 67987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_PCI_IO_PASS_THROUGH_BAR, 68087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Address, 68187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 1, 68287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Data 68387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 68487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Data; 68587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 68687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 68787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 68887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 68987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 69087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 69187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Address TODO: add argument description 69287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 69387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 69487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 69587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 69687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangUINT16 69787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuanginw ( 69887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 69987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Address 70087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 70187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 70287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT16 Data; 70387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 70487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Io.Read ( 70587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo, 70687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthUint16, 70787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_PCI_IO_PASS_THROUGH_BAR, 70887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Address, 70987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 1, 71087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Data 71187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 71287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Data; 71387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 71487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 71587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 71687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 71787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 71887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 71987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Index TODO: add argument description 72087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Red TODO: add argument description 72187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Green TODO: add argument description 72287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Blue TODO: add argument description 72387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 72487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 72587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 72687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 72787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 72887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangSetPaletteColor ( 72987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 73087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Index, 73187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Red, 73287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Green, 73387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Blue 73487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 73587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 73687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index); 73787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2)); 73887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2)); 73987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2)); 74087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 74187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 74287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 74387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 74487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 74587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 74687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 74787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 74887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 74987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 75087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 75187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangSetDefaultPalette ( 75287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private 75387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 75487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 75587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Index; 75687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN RedIndex; 75787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN GreenIndex; 75887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN BlueIndex; 75987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 76087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Index = 0; 76187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (RedIndex = 0; RedIndex < 8; RedIndex++) { 76287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) { 76387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) { 76487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6)); 76587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Index++; 76687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 76787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 76887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 76987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 77087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 77187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 77287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 77387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 77487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 77587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 77687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 77787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 77887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 77987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 78087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangClearScreen ( 78187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private 78287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 78387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 78487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT32 Color; 78587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 78687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Color = 0; 78787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo->Mem.Write ( 78887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Private->PciIo, 78987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EfiPciIoWidthFillUint32, 79087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0, 79187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0, 79287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 0x100000 >> 2, 79387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &Color 79487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 79587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 79687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 79787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 79887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 79987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 80087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 80187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 80287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 80387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 80487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 80587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 80687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangDrawLogo ( 80787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 80887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN ScreenWidth, 80987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN ScreenHeight 81087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 81187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 81287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 81387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 81487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang/** 81587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: Add function description 81687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 81787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param Private TODO: add argument description 81887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang @param ModeData TODO: add argument description 81987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 82087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang TODO: add return values 82187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 82287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang**/ 82387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangVOID 82487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangInitializeGraphicsMode ( 82587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_PRIVATE_DATA *Private, 82687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang CIRRUS_LOGIC_5430_VIDEO_MODES *ModeData 82787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 82887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 82987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINT8 Byte; 83087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang UINTN Index; 83185f8bc32d4e358670b946327a7cb03594ba34938jljusten UINT16 DeviceId; 832c4536608041b6e49ba7c44905070592b08db6b54lgao EFI_STATUS Status; 833c4536608041b6e49ba7c44905070592b08db6b54lgao 834c4536608041b6e49ba7c44905070592b08db6b54lgao Status = Private->PciIo->Pci.Read ( 835c4536608041b6e49ba7c44905070592b08db6b54lgao Private->PciIo, 836c4536608041b6e49ba7c44905070592b08db6b54lgao EfiPciIoWidthUint16, 837c4536608041b6e49ba7c44905070592b08db6b54lgao PCI_DEVICE_ID_OFFSET, 838c4536608041b6e49ba7c44905070592b08db6b54lgao 1, 839c4536608041b6e49ba7c44905070592b08db6b54lgao &DeviceId 840c4536608041b6e49ba7c44905070592b08db6b54lgao ); 84185f8bc32d4e358670b946327a7cb03594ba34938jljusten // 84285f8bc32d4e358670b946327a7cb03594ba34938jljusten // Read the PCI Configuration Header from the PCI Device 84385f8bc32d4e358670b946327a7cb03594ba34938jljusten // 844c4536608041b6e49ba7c44905070592b08db6b54lgao ASSERT_EFI_ERROR (Status); 84587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 84687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, SEQ_ADDRESS_REGISTER, 0x1206); 84787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, SEQ_ADDRESS_REGISTER, 0x0012); 84887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 84987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (Index = 0; Index < 15; Index++) { 85087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, SEQ_ADDRESS_REGISTER, ModeData->SeqSettings[Index]); 85187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 85287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 85385f8bc32d4e358670b946327a7cb03594ba34938jljusten if (DeviceId != CIRRUS_LOGIC_5446_DEVICE_ID) { 85485f8bc32d4e358670b946327a7cb03594ba34938jljusten outb (Private, SEQ_ADDRESS_REGISTER, 0x0f); 85585f8bc32d4e358670b946327a7cb03594ba34938jljusten Byte = (UINT8) ((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30); 85685f8bc32d4e358670b946327a7cb03594ba34938jljusten outb (Private, SEQ_DATA_REGISTER, Byte); 85785f8bc32d4e358670b946327a7cb03594ba34938jljusten } 85887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 85987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, MISC_OUTPUT_REGISTER, ModeData->MiscSetting); 86087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, GRAPH_ADDRESS_REGISTER, 0x0506); 86187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, SEQ_ADDRESS_REGISTER, 0x0300); 86287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, CRTC_ADDRESS_REGISTER, 0x2011); 86387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 86487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (Index = 0; Index < 28; Index++) { 86587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, CRTC_ADDRESS_REGISTER, (UINT16) ((ModeData->CrtcSettings[Index] << 8) | Index)); 86687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 86787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 86887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (Index = 0; Index < 9; Index++) { 86987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((GraphicsController[Index] << 8) | Index)); 87087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 87187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 87287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang inb (Private, INPUT_STATUS_1_REGISTER); 87387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 87487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang for (Index = 0; Index < 21; Index++) { 87587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, ATT_ADDRESS_REGISTER, (UINT8) Index); 87687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, ATT_ADDRESS_REGISTER, AttributeController[Index]); 87787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang } 87887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 87987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, ATT_ADDRESS_REGISTER, 0x20); 88087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 88187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, GRAPH_ADDRESS_REGISTER, 0x0009); 88287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, GRAPH_ADDRESS_REGISTER, 0x000a); 88387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outw (Private, GRAPH_ADDRESS_REGISTER, 0x000b); 88487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang outb (Private, DAC_PIXEL_MASK_REGISTER, 0xff); 88587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 88687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang SetDefaultPalette (Private); 88787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ClearScreen (Private); 88887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 88987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 89087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFI_STATUS 89187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangEFIAPI 89287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuangInitializeCirrusLogic5430 ( 89387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_HANDLE ImageHandle, 89487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang IN EFI_SYSTEM_TABLE *SystemTable 89587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ) 89687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang{ 89787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang EFI_STATUS Status; 89887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 89987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = EfiLibInstallDriverBindingComponentName2 ( 90087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ImageHandle, 90187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang SystemTable, 90287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gCirrusLogic5430DriverBinding, 90387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ImageHandle, 90487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gCirrusLogic5430ComponentName, 90587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gCirrusLogic5430ComponentName2 90687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 90787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ASSERT_EFI_ERROR (Status); 90887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 90987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 91094b73c2482a415da50c5b13c42753ac6f1548c07vanjeff // Install EFI Driver Supported EFI Version Protocol required for 91187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // EFI drivers that are on PCI and other plug in cards. 91287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang // 91387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang gCirrusLogic5430DriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion); 91487f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang Status = gBS->InstallMultipleProtocolInterfaces ( 91587f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &ImageHandle, 91687f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gEfiDriverSupportedEfiVersionProtocolGuid, 91787f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang &gCirrusLogic5430DriverSupportedEfiVersion, 91887f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang NULL 91987f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ); 92087f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang ASSERT_EFI_ERROR (Status); 92187f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang 92287f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang return Status; 92387f8ccbe19e09b6ece2c72bb70add08d0cc627f7qhuang} 924