4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncModule Name:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UefiCirrusLogic5430GraphicsOutput.c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAbstract:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This file produces the graphics abstration of Graphics Output Protocol. It is called by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CirrusLogic5430.c file which deals with the EFI 1.1 driver model.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This file just does graphics.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "CirrusLogic5430.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <IndustryStandard/Acpi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430CompleteModeInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->Version = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelFormat = PixelBitMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelInformation.RedMask = PIXEL_RED_MASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelInformation.ReservedMask = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info->PixelsPerScanLine = Info->HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430CompleteModeData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info = Mode->Info;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CirrusLogic5430CompleteModeInfo (Info);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->GetBarAttributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**) &FrameBufDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Graphics Output Protocol Member Functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430GraphicsOutputQueryMode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 ModeNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *SizeOfInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRoutine Description:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Graphics Output protocol interface to query video mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arguments:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This - Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModeNumber - The mode number to return information on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info - Caller allocated buffer that returns information about ModeNumber.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeOfInfo - A pointer to the size, in bytes, of the Info buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SUCCESS - Mode information returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BUFFER_TOO_SMALL - The Info buffer was too small.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_ERROR - A hardware error occurred trying to retrieve the video mode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_NOT_STARTED - Video display is not initialized. Call SetMode ()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INVALID_PARAMETER - One of the input args was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->HardwareNeedsStarting) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Info == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CirrusLogic5430CompleteModeInfo (*Info);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430GraphicsOutputSetMode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 ModeNumber
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRoutine Description:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Graphics Output protocol interface to set video mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arguments:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This - Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModeNumber - The mode number to be set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SUCCESS - Graphics mode was changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_ERROR - The device had an error and could not complete the request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_UNSUPPORTED - ModeNumber is not supported by this device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_MODE_DATA *ModeData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ModeNumber >= This->Mode->MaxMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModeData = &Private->ModeData[ModeNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->LineBuffer) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Private->LineBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer = AllocatePool (ModeData->HorizontalResolution);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->LineBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeGraphicsMode (Private, &CirrusLogic5430VideoModes[ModeData->ModeNumber]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->Mode->Mode = ModeNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CirrusLogic5430CompleteModeData (Private, This->Mode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->HardwareNeedsStarting = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430GraphicsOutputBlt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRoutine Description:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Graphics Output protocol instance to block transfer for CirrusLogic device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncArguments:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This - Pointer to Graphics Output protocol instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer - The data to transfer to screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltOperation - The operation to perform
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceX - The X coordinate of the source for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceY - The Y coordinate of the source for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX - The X coordinate of the destination for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY - The Y coordinate of the destination for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width - The width of a rectangle in the blt rectangle in pixels
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height - The height of a rectangle in the blt rectangle in pixels
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If a Delta of 0 is used, the entire BltBuffer will be operated on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If a subrectangle of the BltBuffer is used, then Delta represents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the number of bytes in a row of the BltBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SUCCESS - Blt operation success
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OriginalTPL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DstY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SrcY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN X;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Pixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 WidePixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ScreenWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SourceOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CurrentMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((BltOperation < 0) || (BltOperation >= EfiGraphicsOutputBltOperationMax)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0 || Height == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Delta is zero, then the entire BltBuffer is being used, so Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the number of bytes in each row can be computed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Delta == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We need to fill the Virtual Screen buffer with the blt data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The virtual screen is upside down, as the first row is the bootom row of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentMode = This->Mode->Mode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure the SourceX, SourceY, DestinationX, DestinationY, Width, and Height parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // are valid for the operation and the current screen geometry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BltOperation == EfiBltVideoToBltBuffer) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Video to BltBuffer: Source is Video, destination is BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceY + Height > Private->ModeData[CurrentMode].VerticalResolution) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceX + Width > Private->ModeData[CurrentMode].HorizontalResolution) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BltBuffer to Video: Source is BltBuffer, destination is Video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationY + Height > Private->ModeData[CurrentMode].VerticalResolution) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationX + Width > Private->ModeData[CurrentMode].HorizontalResolution) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We would not want a timer based event (Cursor, ...) to come in while we are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // doing this operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (BltOperation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoToBltBuffer:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Video to BltBuffer: Source is Video, destination is BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (SrcY = SourceY, DstY = DestinationY; DstY < (Height + DestinationY); SrcY++, DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (SrcY * Private->ModeData[CurrentMode].HorizontalResolution) + SourceX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width >> 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = 0; X < Width; X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt->Red = PIXEL_TO_RED_BYTE (Private->LineBuffer[X]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt->Green = PIXEL_TO_GREEN_BYTE (Private->LineBuffer[X]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt->Blue = PIXEL_TO_BLUE_BYTE (Private->LineBuffer[X]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoToVideo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Perform hardware acceleration for Video to Video operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenWidth = Private->ModeData[CurrentMode].HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceOffset = (SourceY * Private->ModeData[CurrentMode].HorizontalResolution) + (SourceX);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DestinationY * Private->ModeData[CurrentMode].HorizontalResolution) + (DestinationX);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0010);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0012);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0014);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0001);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0011);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0013);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0015);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((Width << 8) & 0xff00) | 0x20));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((Width & 0xff00) | 0x21));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((Height << 8) & 0xff00) | 0x22));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((Height & 0xff00) | 0x23));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((ScreenWidth << 8) & 0xff00) | 0x24));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((ScreenWidth & 0xff00) | 0x25));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((ScreenWidth << 8) & 0xff00) | 0x26));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((ScreenWidth & 0xff00) | 0x27));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) << 8) & 0xff00) | 0x28));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) >> 0) & 0xff00) | 0x29));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) >> 8) & 0xff00) | 0x2a));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) << 8) & 0xff00) | 0x2c));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) >> 0) & 0xff00) | 0x2d));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) >> 8) & 0xff00) | 0x2e));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x002f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0030);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0d32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0033);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0034);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0035);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0231);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, GRAPH_ADDRESS_REGISTER, 0x31);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((inb (Private, GRAPH_DATA_REGISTER) & 0x01) == 0x01)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoFill:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt = BltBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pixel = RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidePixel = (Pixel << 8) | Pixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidePixel = (WidePixel << 16) | WidePixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationX == 0 && Width == Private->ModeData[CurrentMode].HorizontalResolution) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = DestinationY * Private->ModeData[CurrentMode].HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Offset & 0x03) == 0) && (((Width * Height) & 0x03) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthFillUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Width * Height) >> 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &WidePixel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthFillUint8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width * Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pixel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DstY * Private->ModeData[CurrentMode].HorizontalResolution) + DestinationX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthFillUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width >> 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &WidePixel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthFillUint8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pixel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltBufferToVideo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = 0; X < Width; X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8 *) BltBuffer +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (SrcY * Delta) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer[X] =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DstY * Private->ModeData[CurrentMode].HorizontalResolution) + DestinationX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width >> 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OriginalTPL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430GraphicsOutputConstructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GraphicsOutput = &Private->GraphicsOutput;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GraphicsOutput->QueryMode = CirrusLogic5430GraphicsOutputQueryMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GraphicsOutput->SetMode = CirrusLogic5430GraphicsOutputSetMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GraphicsOutput->Blt = CirrusLogic5430GraphicsOutputBlt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the private data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->AllocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiBootServicesData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Private->GraphicsOutput.Mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->AllocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiBootServicesData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Private->GraphicsOutput.Mode->Info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->HardwareNeedsStarting = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->LineBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the hardware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GraphicsOutput->SetMode (GraphicsOutput, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Private->GraphicsOutput.Mode->Mode < CIRRUS_LOGIC_5430_MODE_COUNT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DrawLogo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCirrusLogic5430GraphicsOutputDestructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CIRRUS_LOGIC_5430_PRIVATE_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRoutine Description:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncArguments:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->GraphicsOutput.Mode != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->GraphicsOutput.Mode->Info != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Private->GraphicsOutput.Mode->Info);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Private->GraphicsOutput.Mode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync