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