Gop.c revision eaf4f336ea42dc32e1a5b31d6b7822c125a15d34
1eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/** @file 2eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output Protocol functions for the QEMU video controller. 3eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 4eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR> 5eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 6eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This program and the accompanying materials 7eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten are licensed and made available under the terms and conditions of the BSD License 8eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten which accompanies this distribution. The full text of the license may be found at 9eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten http://opensource.org/licenses/bsd-license.php 10eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 11eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 14eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten**/ 15eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 16eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include "Qemu.h" 17eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include <IndustryStandard/Acpi.h> 18eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include <Library/BltLib.h> 19eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 20eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenSTATIC 21eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenVOID 22eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoCompleteModeInfo ( 23eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN QEMU_VIDEO_MODE_DATA *ModeData, 24eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info 25eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 26eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 27eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->Version = 0; 28eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (ModeData->ColorDepth == 8) { 29eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelFormat = PixelBitMask; 30eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.RedMask = PIXEL_RED_MASK; 31eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK; 32eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK; 33eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.ReservedMask = 0; 34eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } else if (ModeData->ColorDepth == 24) { 35eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelFormat = PixelBitMask; 36eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.RedMask = PIXEL24_RED_MASK; 37eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.GreenMask = PIXEL24_GREEN_MASK; 38eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK; 39eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelInformation.ReservedMask = 0; 40eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } else if (ModeData->ColorDepth == 32) { 41eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DEBUG ((EFI_D_INFO, "PixelBlueGreenRedReserved8BitPerColor\n")); 42eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor; 43eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 44eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info->PixelsPerScanLine = Info->HorizontalResolution; 45eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 46eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 47eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 48eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenSTATIC 49eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 50eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoCompleteModeData ( 51eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN QEMU_VIDEO_PRIVATE_DATA *Private, 52eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode 53eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 54eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 55eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; 56eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc; 57eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 58eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 59eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[Mode->Mode]; 60eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info = Mode->Info; 61eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeInfo (ModeData, Info); 62eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 63eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->PciIo->GetBarAttributes ( 64eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->PciIo, 65eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 0, 66eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten NULL, 67eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID**) &FrameBufDesc 68eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 69eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 70eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin; 71eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution; 72eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Mode->FrameBufferSize = Mode->FrameBufferSize * ((ModeData->ColorDepth + 7) / 8); 73eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", Mode->FrameBufferBase, Mode->FrameBufferSize)); 74eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 75eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 76eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 77eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 78eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 79eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// 80eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// Graphics Output Protocol Member Functions 81eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// 82eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 83eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 84eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputQueryMode ( 85eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 86eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINT32 ModeNumber, 87eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT UINTN *SizeOfInfo, 88eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info 89eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 90eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 91eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 92eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 93eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 94eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol interface to query video mode 95eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 96eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Arguments: 97eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Protocol instance pointer. 98eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeNumber - The mode number to return information on. 99eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info - Caller allocated buffer that returns information about ModeNumber. 100eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SizeOfInfo - A pointer to the size, in bytes, of the Info buffer. 101eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 102eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Returns: 103eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Mode information returned. 104eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_BUFFER_TOO_SMALL - The Info buffer was too small. 105eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_DEVICE_ERROR - A hardware error occurred trying to retrieve the video mode. 106eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_NOT_STARTED - Video display is not initialized. Call SetMode () 107eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_INVALID_PARAMETER - One of the input args was NULL. 108eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 109eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 110eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 111eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private; 112eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 113eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 114eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); 115eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 116eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->HardwareNeedsStarting) { 117eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_NOT_STARTED; 118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) { 121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_INVALID_PARAMETER; 122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); 125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (*Info == NULL) { 126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->HorizontalResolution = ModeData->HorizontalResolution; 133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->VerticalResolution = ModeData->VerticalResolution; 134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeInfo (ModeData, *Info); 135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode ( 142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINT32 ModeNumber 144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol interface to set video mode 150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Arguments: 152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Protocol instance pointer. 153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeNumber - The mode number to be set. 154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Returns: 156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Graphics mode was changed. 157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_DEVICE_ERROR - The device had an error and could not complete the request. 158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_UNSUPPORTED - ModeNumber is not supported by this device. 159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private; 163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// UINTN Count; 165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); 167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (ModeNumber >= This->Mode->MaxMode) { 169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_UNSUPPORTED; 170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer) { 175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->LineBuffer); 176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = NULL; 179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution); 180eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer == NULL) { 181eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 182eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 183eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 184eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten InitializeGraphicsMode (Private, &QemuVideoVideoModes[ModeData->ModeNumber]); 185eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 186eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Mode = ModeNumber; 187eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution; 188eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; 189eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 190eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 191eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeData (Private, This->Mode); 192eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 193eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltLibConfigure ( 194eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID*)(UINTN) This->Mode->FrameBufferBase, 195eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info 196eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 197eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 198eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->HardwareNeedsStarting = FALSE; 199eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt ( 206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL 208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, 209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceX, 210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceY, 211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationX, 212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationY, 213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Width, 214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Height, 215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Delta 216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol instance to block transfer for CirrusLogic device 222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Pointer to Graphics Output protocol instance 226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer - The data to transfer to screen 227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation - The operation to perform 228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX - The X coordinate of the source for BltOperation 229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY - The Y coordinate of the source for BltOperation 230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX - The X coordinate of the destination for BltOperation 231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY - The Y coordinate of the destination for BltOperation 232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width - The width of a rectangle in the blt rectangle in pixels 233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height - The height of a rectangle in the blt rectangle in pixels 234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation. 235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a Delta of 0 is used, the entire BltBuffer will be operated on. 236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a subrectangle of the BltBuffer is used, then Delta represents 237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten the number of bytes in a row of the BltBuffer. 238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_INVALID_PARAMETER - Invalid parameter passed in 242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Blt operation success 243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_TPL OriginalTPL; 248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We have to raise to TPL Notify, so we make an atomic write the frame buffer. 251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We would not want a timer based event (Cursor, ...) to come in while we are 252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // doing this operation. 253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY); 255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten switch (BltOperation) { 257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToBltBuffer: 258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltBufferToVideo: 259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoFill: 260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToVideo: 261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = BltLibGopBlt ( 262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer, 263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation, 264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX, 265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY, 266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX, 267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY, 268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width, 269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height, 270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta 271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten break; 273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten default: 275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = EFI_INVALID_PARAMETER; 276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ASSERT (FALSE); 277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->RestoreTPL (OriginalTPL); 280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor ( 286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput = &Private->GraphicsOutput; 294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode; 295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->SetMode = QemuVideoGraphicsOutputSetMode; 296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->Blt = QemuVideoGraphicsOutputBlt; 297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the private data 300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE), 304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode 305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION), 312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode->Info 313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 317eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode; 318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; 319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->HardwareNeedsStarting = TRUE; 320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = NULL; 321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the hardware 324eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->SetMode (GraphicsOutput, 0); 326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DrawLogo ( 327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private, 328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution, 329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution 330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 333eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 334eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 335eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 336eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor ( 337eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 345eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 346eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 347eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten None 348eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 349eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 350eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 351eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode != NULL) { 352eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode->Info != NULL) { 353eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode->Info); 354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode); 356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 362