Gop.c revision 5cdb96fa0d5f689cb4b3b17ddd2cec164842aebd
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 755cdb96fa0d5f689cb4b3b17ddd2cec164842aebdLaszlo Ersek FreePool (FrameBufDesc); 76eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 77eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 78eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 79eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 80eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// 81eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// Graphics Output Protocol Member Functions 82eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// 83eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 84eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 85eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputQueryMode ( 86eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 87eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINT32 ModeNumber, 88eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT UINTN *SizeOfInfo, 89eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info 90eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 91eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 92eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 93eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 94eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 95eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol interface to query video mode 96eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 97eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Arguments: 98eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Protocol instance pointer. 99eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeNumber - The mode number to return information on. 100eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Info - Caller allocated buffer that returns information about ModeNumber. 101eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SizeOfInfo - A pointer to the size, in bytes, of the Info buffer. 102eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 103eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Returns: 104eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Mode information returned. 105eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_BUFFER_TOO_SMALL - The Info buffer was too small. 106eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_DEVICE_ERROR - A hardware error occurred trying to retrieve the video mode. 107eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_NOT_STARTED - Video display is not initialized. Call SetMode () 108eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_INVALID_PARAMETER - One of the input args was NULL. 109eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 110eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 111eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 112eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private; 113eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 114eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 115eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); 116eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 117eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->HardwareNeedsStarting) { 118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_NOT_STARTED; 119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) { 122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_INVALID_PARAMETER; 123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); 126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (*Info == NULL) { 127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->HorizontalResolution = ModeData->HorizontalResolution; 134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->VerticalResolution = ModeData->VerticalResolution; 135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeInfo (ModeData, *Info); 136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode ( 143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINT32 ModeNumber 145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol interface to set video mode 151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Arguments: 153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Protocol instance pointer. 154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeNumber - The mode number to be set. 155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Returns: 157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Graphics mode was changed. 158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_DEVICE_ERROR - The device had an error and could not complete the request. 159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_UNSUPPORTED - ModeNumber is not supported by this device. 160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private; 164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// UINTN Count; 166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); 168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (ModeNumber >= This->Mode->MaxMode) { 170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_UNSUPPORTED; 171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer) { 176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->LineBuffer); 177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = NULL; 180eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution); 181eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer == NULL) { 182eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 183eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 184eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 185212aac55fd13e985cebf88042f40479c01ac2e44jljusten switch (Private->Variant) { 186212aac55fd13e985cebf88042f40479c01ac2e44jljusten case QEMU_VIDEO_CIRRUS_5430: 187212aac55fd13e985cebf88042f40479c01ac2e44jljusten case QEMU_VIDEO_CIRRUS_5446: 188212aac55fd13e985cebf88042f40479c01ac2e44jljusten InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->ModeNumber]); 189212aac55fd13e985cebf88042f40479c01ac2e44jljusten break; 190cdb4f5dcb1d4778da71c82cc15cab6e3cf218417jljusten case QEMU_VIDEO_BOCHS_MMIO: 19154f9b9accbcb6dc7f965342fc75b478464de21a3jljusten case QEMU_VIDEO_BOCHS: 19254f9b9accbcb6dc7f965342fc75b478464de21a3jljusten InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->ModeNumber]); 19354f9b9accbcb6dc7f965342fc75b478464de21a3jljusten break; 194212aac55fd13e985cebf88042f40479c01ac2e44jljusten default: 195212aac55fd13e985cebf88042f40479c01ac2e44jljusten ASSERT (FALSE); 196212aac55fd13e985cebf88042f40479c01ac2e44jljusten gBS->FreePool (Private->LineBuffer); 197212aac55fd13e985cebf88042f40479c01ac2e44jljusten Private->LineBuffer = NULL; 198212aac55fd13e985cebf88042f40479c01ac2e44jljusten return EFI_DEVICE_ERROR; 199212aac55fd13e985cebf88042f40479c01ac2e44jljusten } 200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Mode = ModeNumber; 202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution; 203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; 204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeData (Private, This->Mode); 207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltLibConfigure ( 209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID*)(UINTN) This->Mode->FrameBufferBase, 210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info 211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->HardwareNeedsStarting = FALSE; 214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt ( 221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL 223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, 224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceX, 225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceY, 226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationX, 227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationY, 228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Width, 229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Height, 230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Delta 231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol instance to block transfer for CirrusLogic device 237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Pointer to Graphics Output protocol instance 241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer - The data to transfer to screen 242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation - The operation to perform 243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX - The X coordinate of the source for BltOperation 244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY - The Y coordinate of the source for BltOperation 245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX - The X coordinate of the destination for BltOperation 246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY - The Y coordinate of the destination for BltOperation 247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width - The width of a rectangle in the blt rectangle in pixels 248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height - The height of a rectangle in the blt rectangle in pixels 249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation. 250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a Delta of 0 is used, the entire BltBuffer will be operated on. 251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a subrectangle of the BltBuffer is used, then Delta represents 252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten the number of bytes in a row of the BltBuffer. 253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_INVALID_PARAMETER - Invalid parameter passed in 257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Blt operation success 258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_TPL OriginalTPL; 263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We have to raise to TPL Notify, so we make an atomic write the frame buffer. 266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We would not want a timer based event (Cursor, ...) to come in while we are 267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // doing this operation. 268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY); 270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten switch (BltOperation) { 272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToBltBuffer: 273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltBufferToVideo: 274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoFill: 275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToVideo: 276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = BltLibGopBlt ( 277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer, 278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation, 279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX, 280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY, 281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX, 282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY, 283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width, 284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height, 285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta 286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten break; 288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten default: 290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = EFI_INVALID_PARAMETER; 291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ASSERT (FALSE); 292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->RestoreTPL (OriginalTPL); 295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor ( 301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput = &Private->GraphicsOutput; 309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode; 310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->SetMode = QemuVideoGraphicsOutputSetMode; 311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->Blt = QemuVideoGraphicsOutputBlt; 312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the private data 315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 317eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE), 319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode 320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 324eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION), 327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode->Info 328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode; 333eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; 334eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->HardwareNeedsStarting = TRUE; 335eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = NULL; 336eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 337eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the hardware 339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->SetMode (GraphicsOutput, 0); 341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DrawLogo ( 342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private, 343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution, 344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution 345eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 346eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 347eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 348eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 349eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 350eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 351eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor ( 352eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 353eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 362eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten None 363eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 364eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 365eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 366eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode != NULL) { 367eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode->Info != NULL) { 368eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode->Info); 369eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 370eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode); 371eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 372eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 373eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 374eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 375eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 376eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 377