123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917 |
- /** @file
- Cirrus Logic 5430 Controller Driver.
- This driver is a sample implementation of the UGA Draw and Graphics Output
- Protocols for the Cirrus Logic 5430 family of PCI video controllers.
- This driver is only usable in the EFI pre-boot environment.
- This sample is intended to show how the UGA Draw and Graphics output Protocol
- is able to function.
- The UGA I/O Protocol is not implemented in this sample.
- A fully compliant EFI UGA driver requires both
- the UGA Draw and the UGA I/O Protocol. Please refer to Microsoft's
- documentation on UGA for details on how to write a UGA driver that is able
- to function both in the EFI pre-boot environment and from the OS runtime.
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- //
- // Cirrus Logic 5430 Controller Driver
- //
- #include "CirrusLogic5430.h"
- EFI_DRIVER_BINDING_PROTOCOL gCirrusLogic5430DriverBinding = {
- CirrusLogic5430ControllerDriverSupported,
- CirrusLogic5430ControllerDriverStart,
- CirrusLogic5430ControllerDriverStop,
- 0x10,
- NULL,
- NULL
- };
- ///
- /// Generic Attribute Controller Register Settings
- ///
- UINT8 AttributeController[21] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x41, 0x00, 0x0F, 0x00, 0x00
- };
- ///
- /// Generic Graphics Controller Register Settings
- ///
- UINT8 GraphicsController[9] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF
- };
- //
- // 640 x 480 x 256 color @ 60 Hertz
- //
- UINT8 Crtc_640_480_256_60[28] = {
- 0x5d, 0x4f, 0x50, 0x82, 0x53, 0x9f, 0x00, 0x3e,
- 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xe1, 0x83, 0xdf, 0x50, 0x00, 0xe7, 0x04, 0xe3,
- 0xff, 0x00, 0x00, 0x22
- };
- UINT16 Seq_640_480_256_60[15] = {
- 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
- 0x5b0c, 0x450d, 0x7e0e, 0x2b1b, 0x2f1c, 0x301d, 0x331e
- };
- //
- // 800 x 600 x 256 color @ 60 Hertz
- //
- UINT8 Crtc_800_600_256_60[28] = {
- 0x7F, 0x63, 0x64, 0x80, 0x6B, 0x1B, 0x72, 0xF0,
- 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x58, 0x8C, 0x57, 0x64, 0x00, 0x5F, 0x91, 0xE3,
- 0xFF, 0x00, 0x00, 0x22
- };
- UINT16 Seq_800_600_256_60[15] = {
- 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
- 0x5b0c, 0x450d, 0x510e, 0x2b1b, 0x2f1c, 0x301d, 0x3a1e
- };
- //
- // 1024 x 768 x 256 color @ 60 Hertz
- //
- UINT8 Crtc_1024_768_256_60[28] = {
- 0xA3, 0x7F, 0x80, 0x86, 0x85, 0x96, 0x24, 0xFD,
- 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x88, 0xFF, 0x80, 0x00, 0x00, 0x24, 0xE3,
- 0xFF, 0x4A, 0x00, 0x22
- };
- UINT16 Seq_1024_768_256_60[15] = {
- 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
- 0x5b0c, 0x450d, 0x760e, 0x2b1b, 0x2f1c, 0x301d, 0x341e
- };
- ///
- /// Table of supported video modes
- ///
- CIRRUS_LOGIC_5430_VIDEO_MODES CirrusLogic5430VideoModes[] = {
- { 640, 480, 8, 60, Crtc_640_480_256_60, Seq_640_480_256_60, 0xe3 },
- { 800, 600, 8, 60, Crtc_800_600_256_60, Seq_800_600_256_60, 0xef },
- { 1024, 768, 8, 60, Crtc_1024_768_256_60, Seq_1024_768_256_60, 0xef }
- };
- /**
- CirrusLogic5430ControllerDriverSupported
- TODO: This - add argument and description to function comment
- TODO: Controller - add argument and description to function comment
- TODO: RemainingDevicePath - add argument and description to function comment
- **/
- EFI_STATUS
- EFIAPI
- CirrusLogic5430ControllerDriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
- {
- EFI_STATUS Status;
- EFI_PCI_IO_PROTOCOL *PciIo;
- PCI_TYPE00 Pci;
- EFI_DEV_PATH *Node;
- //
- // Open the PCI I/O Protocol
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- (VOID **) &PciIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Read the PCI Configuration Header from the PCI Device
- //
- Status = PciIo->Pci.Read (
- PciIo,
- EfiPciIoWidthUint32,
- 0,
- sizeof (Pci) / sizeof (UINT32),
- &Pci
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
- Status = EFI_UNSUPPORTED;
- //
- // See if the I/O enable is on. Most systems only allow one VGA device to be turned on
- // at a time, so see if this is one that is turned on.
- //
- // if (((Pci.Hdr.Command & 0x01) == 0x01)) {
- //
- // See if this is a Cirrus Logic PCI controller
- //
- if (Pci.Hdr.VendorId == CIRRUS_LOGIC_VENDOR_ID) {
- //
- // See if this is a 5430 or a 5446 PCI controller
- //
- if (Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_DEVICE_ID ||
- Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID ||
- Pci.Hdr.DeviceId == CIRRUS_LOGIC_5446_DEVICE_ID) {
-
- Status = EFI_SUCCESS;
- //
- // If this is an Intel 945 graphics controller,
- // go further check RemainingDevicePath validation
- //
- if (RemainingDevicePath != NULL) {
- Node = (EFI_DEV_PATH *) RemainingDevicePath;
- //
- // Check if RemainingDevicePath is the End of Device Path Node,
- // if yes, return EFI_SUCCESS
- //
- if (!IsDevicePathEnd (Node)) {
- //
- // If RemainingDevicePath isn't the End of Device Path Node,
- // check its validation
- //
- if (Node->DevPath.Type != ACPI_DEVICE_PATH ||
- Node->DevPath.SubType != ACPI_ADR_DP ||
- DevicePathNodeLength(&Node->DevPath) != sizeof(ACPI_ADR_DEVICE_PATH)) {
- Status = EFI_UNSUPPORTED;
- }
- }
- }
- }
- }
- Done:
- //
- // Close the PCI I/O Protocol
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- return Status;
- }
- /**
- CirrusLogic5430ControllerDriverStart
- TODO: This - add argument and description to function comment
- TODO: Controller - add argument and description to function comment
- TODO: RemainingDevicePath - add argument and description to function comment
- **/
- EFI_STATUS
- EFIAPI
- CirrusLogic5430ControllerDriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
- {
- EFI_STATUS Status;
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;
- BOOLEAN PciAttributesSaved;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- ACPI_ADR_DEVICE_PATH AcpiDeviceNode;
- UINT64 Supports;
- PciAttributesSaved = FALSE;
- //
- // Allocate Private context data for UGA Draw inteface.
- //
- Private = AllocateZeroPool (sizeof (CIRRUS_LOGIC_5430_PRIVATE_DATA));
- if (Private == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Error;
- }
- //
- // Set up context record
- //
- Private->Signature = CIRRUS_LOGIC_5430_PRIVATE_DATA_SIGNATURE;
- Private->Handle = NULL;
- //
- // Open PCI I/O Protocol
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- (VOID **) &Private->PciIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- //
- // Get supported PCI attributes
- //
- Status = Private->PciIo->Attributes (
- Private->PciIo,
- EfiPciIoAttributeOperationSupported,
- 0,
- &Supports
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- Supports &= (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16);
- if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) {
- Status = EFI_UNSUPPORTED;
- goto Error;
- }
- //
- // Save original PCI attributes
- //
- Status = Private->PciIo->Attributes (
- Private->PciIo,
- EfiPciIoAttributeOperationGet,
- 0,
- &Private->OriginalPciAttributes
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- PciAttributesSaved = TRUE;
- Status = Private->PciIo->Attributes (
- Private->PciIo,
- EfiPciIoAttributeOperationEnable,
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | Supports,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- //
- // Get ParentDevicePath
- //
- Status = gBS->HandleProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- if (FeaturePcdGet (PcdSupportGop)) {
- //
- // Set Gop Device Path
- //
- if (RemainingDevicePath == NULL) {
- ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH));
- AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH;
- AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;
- AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);
- SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));
- Private->GopDevicePath = AppendDevicePathNode (
- ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode
- );
- } else if (!IsDevicePathEnd (RemainingDevicePath)) {
- //
- // If RemainingDevicePath isn't the End of Device Path Node,
- // only scan the specified device by RemainingDevicePath
- //
- Private->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath);
- } else {
- //
- // If RemainingDevicePath is the End of Device Path Node,
- // don't create child device and return EFI_SUCCESS
- //
- Private->GopDevicePath = NULL;
- }
-
- if (Private->GopDevicePath != NULL) {
- //
- // Creat child handle and device path protocol firstly
- //
- Private->Handle = NULL;
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Private->Handle,
- &gEfiDevicePathProtocolGuid,
- Private->GopDevicePath,
- NULL
- );
- }
- }
- //
- // Construct video mode buffer
- //
- Status = CirrusLogic5430VideoModeSetup (Private);
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- if (FeaturePcdGet (PcdSupportUga)) {
- //
- // Start the UGA Draw software stack.
- //
- Status = CirrusLogic5430UgaDrawConstructor (Private);
- ASSERT_EFI_ERROR (Status);
- Private->UgaDevicePath = ParentDevicePath;
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Controller,
- &gEfiUgaDrawProtocolGuid,
- &Private->UgaDraw,
- &gEfiDevicePathProtocolGuid,
- Private->UgaDevicePath,
- NULL
- );
- } else if (FeaturePcdGet (PcdSupportGop)) {
- if (Private->GopDevicePath == NULL) {
- //
- // If RemainingDevicePath is the End of Device Path Node,
- // don't create child device and return EFI_SUCCESS
- //
- Status = EFI_SUCCESS;
- } else {
-
- //
- // Start the GOP software stack.
- //
- Status = CirrusLogic5430GraphicsOutputConstructor (Private);
- ASSERT_EFI_ERROR (Status);
-
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Private->Handle,
- &gEfiGraphicsOutputProtocolGuid,
- &Private->GraphicsOutput,
- &gEfiEdidDiscoveredProtocolGuid,
- &Private->EdidDiscovered,
- &gEfiEdidActiveProtocolGuid,
- &Private->EdidActive,
- NULL
- );
- }
- } else {
- //
- // This driver must support eithor GOP or UGA or both.
- //
- ASSERT (FALSE);
- Status = EFI_UNSUPPORTED;
- }
- Error:
- if (EFI_ERROR (Status)) {
- if (Private) {
- if (Private->PciIo) {
- if (PciAttributesSaved == TRUE) {
- //
- // Restore original PCI attributes
- //
- Private->PciIo->Attributes (
- Private->PciIo,
- EfiPciIoAttributeOperationSet,
- Private->OriginalPciAttributes,
- NULL
- );
- }
- //
- // Close the PCI I/O Protocol
- //
- gBS->CloseProtocol (
- Private->Handle,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Private->Handle
- );
- }
- gBS->FreePool (Private);
- }
- }
- return Status;
- }
- /**
- CirrusLogic5430ControllerDriverStop
- TODO: This - add argument and description to function comment
- TODO: Controller - add argument and description to function comment
- TODO: NumberOfChildren - add argument and description to function comment
- TODO: ChildHandleBuffer - add argument and description to function comment
- TODO: EFI_SUCCESS - add return value to function comment
- **/
- EFI_STATUS
- EFIAPI
- CirrusLogic5430ControllerDriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
- {
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
- EFI_STATUS Status;
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;
- if (FeaturePcdGet (PcdSupportUga)) {
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUgaDrawProtocolGuid,
- (VOID **) &UgaDraw,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Get our private context information
- //
- Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_UGA_DRAW_THIS (UgaDraw);
- CirrusLogic5430UgaDrawDestructor (Private);
- if (FeaturePcdGet (PcdSupportGop)) {
- CirrusLogic5430GraphicsOutputDestructor (Private);
- //
- // Remove the UGA and GOP protocol interface from the system
- //
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Private->Handle,
- &gEfiUgaDrawProtocolGuid,
- &Private->UgaDraw,
- &gEfiGraphicsOutputProtocolGuid,
- &Private->GraphicsOutput,
- NULL
- );
- } else {
- //
- // Remove the UGA Draw interface from the system
- //
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Private->Handle,
- &gEfiUgaDrawProtocolGuid,
- &Private->UgaDraw,
- NULL
- );
- }
- } else {
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiGraphicsOutputProtocolGuid,
- (VOID **) &GraphicsOutput,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Get our private context information
- //
- Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);
- CirrusLogic5430GraphicsOutputDestructor (Private);
- //
- // Remove the GOP protocol interface from the system
- //
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Private->Handle,
- &gEfiUgaDrawProtocolGuid,
- &Private->UgaDraw,
- &gEfiGraphicsOutputProtocolGuid,
- &Private->GraphicsOutput,
- NULL
- );
- }
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Restore original PCI attributes
- //
- Private->PciIo->Attributes (
- Private->PciIo,
- EfiPciIoAttributeOperationSet,
- Private->OriginalPciAttributes,
- NULL
- );
- //
- // Close the PCI I/O Protocol
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiPciIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- //
- // Free our instance data
- //
- gBS->FreePool (Private);
- return EFI_SUCCESS;
- }
- /**
- CirrusLogic5430UgaDrawDestructor
- TODO: Private - add argument and description to function comment
- TODO: EFI_SUCCESS - add return value to function comment
- **/
- EFI_STATUS
- CirrusLogic5430UgaDrawDestructor (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
- )
- {
- return EFI_SUCCESS;
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param Address TODO: add argument description
- @param Data TODO: add argument description
- TODO: add return values
- **/
- VOID
- outb (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN Address,
- UINT8 Data
- )
- {
- Private->PciIo->Io.Write (
- Private->PciIo,
- EfiPciIoWidthUint8,
- EFI_PCI_IO_PASS_THROUGH_BAR,
- Address,
- 1,
- &Data
- );
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param Address TODO: add argument description
- @param Data TODO: add argument description
- TODO: add return values
- **/
- VOID
- outw (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN Address,
- UINT16 Data
- )
- {
- Private->PciIo->Io.Write (
- Private->PciIo,
- EfiPciIoWidthUint16,
- EFI_PCI_IO_PASS_THROUGH_BAR,
- Address,
- 1,
- &Data
- );
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param Address TODO: add argument description
- TODO: add return values
- **/
- UINT8
- inb (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN Address
- )
- {
- UINT8 Data;
- Private->PciIo->Io.Read (
- Private->PciIo,
- EfiPciIoWidthUint8,
- EFI_PCI_IO_PASS_THROUGH_BAR,
- Address,
- 1,
- &Data
- );
- return Data;
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param Address TODO: add argument description
- TODO: add return values
- **/
- UINT16
- inw (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN Address
- )
- {
- UINT16 Data;
- Private->PciIo->Io.Read (
- Private->PciIo,
- EfiPciIoWidthUint16,
- EFI_PCI_IO_PASS_THROUGH_BAR,
- Address,
- 1,
- &Data
- );
- return Data;
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param Index TODO: add argument description
- @param Red TODO: add argument description
- @param Green TODO: add argument description
- @param Blue TODO: add argument description
- TODO: add return values
- **/
- VOID
- SetPaletteColor (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN Index,
- UINT8 Red,
- UINT8 Green,
- UINT8 Blue
- )
- {
- outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);
- outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));
- outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));
- outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2));
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- TODO: add return values
- **/
- VOID
- SetDefaultPalette (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
- )
- {
- UINTN Index;
- UINTN RedIndex;
- UINTN GreenIndex;
- UINTN BlueIndex;
- Index = 0;
- for (RedIndex = 0; RedIndex < 8; RedIndex++) {
- for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) {
- for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) {
- SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6));
- Index++;
- }
- }
- }
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- TODO: add return values
- **/
- VOID
- ClearScreen (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
- )
- {
- UINT32 Color;
- Color = 0;
- Private->PciIo->Mem.Write (
- Private->PciIo,
- EfiPciIoWidthFillUint32,
- 0,
- 0,
- 0x100000 >> 2,
- &Color
- );
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- TODO: add return values
- **/
- VOID
- DrawLogo (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- UINTN ScreenWidth,
- UINTN ScreenHeight
- )
- {
- }
- /**
- TODO: Add function description
- @param Private TODO: add argument description
- @param ModeData TODO: add argument description
- TODO: add return values
- **/
- VOID
- InitializeGraphicsMode (
- CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
- CIRRUS_LOGIC_5430_VIDEO_MODES *ModeData
- )
- {
- UINT8 Byte;
- UINTN Index;
- UINT16 DeviceId;
- EFI_STATUS Status;
- Status = Private->PciIo->Pci.Read (
- Private->PciIo,
- EfiPciIoWidthUint16,
- PCI_DEVICE_ID_OFFSET,
- 1,
- &DeviceId
- );
- //
- // Read the PCI Configuration Header from the PCI Device
- //
- ASSERT_EFI_ERROR (Status);
- outw (Private, SEQ_ADDRESS_REGISTER, 0x1206);
- outw (Private, SEQ_ADDRESS_REGISTER, 0x0012);
- for (Index = 0; Index < 15; Index++) {
- outw (Private, SEQ_ADDRESS_REGISTER, ModeData->SeqSettings[Index]);
- }
- if (DeviceId != CIRRUS_LOGIC_5446_DEVICE_ID) {
- outb (Private, SEQ_ADDRESS_REGISTER, 0x0f);
- Byte = (UINT8) ((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30);
- outb (Private, SEQ_DATA_REGISTER, Byte);
- }
- outb (Private, MISC_OUTPUT_REGISTER, ModeData->MiscSetting);
- outw (Private, GRAPH_ADDRESS_REGISTER, 0x0506);
- outw (Private, SEQ_ADDRESS_REGISTER, 0x0300);
- outw (Private, CRTC_ADDRESS_REGISTER, 0x2011);
- for (Index = 0; Index < 28; Index++) {
- outw (Private, CRTC_ADDRESS_REGISTER, (UINT16) ((ModeData->CrtcSettings[Index] << 8) | Index));
- }
- for (Index = 0; Index < 9; Index++) {
- outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((GraphicsController[Index] << 8) | Index));
- }
- inb (Private, INPUT_STATUS_1_REGISTER);
- for (Index = 0; Index < 21; Index++) {
- outb (Private, ATT_ADDRESS_REGISTER, (UINT8) Index);
- outb (Private, ATT_ADDRESS_REGISTER, AttributeController[Index]);
- }
- outb (Private, ATT_ADDRESS_REGISTER, 0x20);
- outw (Private, GRAPH_ADDRESS_REGISTER, 0x0009);
- outw (Private, GRAPH_ADDRESS_REGISTER, 0x000a);
- outw (Private, GRAPH_ADDRESS_REGISTER, 0x000b);
- outb (Private, DAC_PIXEL_MASK_REGISTER, 0xff);
- SetDefaultPalette (Private);
- ClearScreen (Private);
- }
- EFI_STATUS
- EFIAPI
- InitializeCirrusLogic5430 (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
- {
- EFI_STATUS Status;
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &gCirrusLogic5430DriverBinding,
- ImageHandle,
- &gCirrusLogic5430ComponentName,
- &gCirrusLogic5430ComponentName2
- );
- ASSERT_EFI_ERROR (Status);
- //
- // Install EFI Driver Supported EFI Version Protocol required for
- // EFI drivers that are on PCI and other plug in cards.
- //
- gCirrusLogic5430DriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion);
- Status = gBS->InstallMultipleProtocolInterfaces (
- &ImageHandle,
- &gEfiDriverSupportedEfiVersionProtocolGuid,
- &gCirrusLogic5430DriverSupportedEfiVersion,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
- return Status;
- }
|