Gop.c revision cd1526101469cb639c7166c0b750c5ebb810a446
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 (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) { 118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_INVALID_PARAMETER; 119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); 122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (*Info == NULL) { 123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->HorizontalResolution = ModeData->HorizontalResolution; 130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (*Info)->VerticalResolution = ModeData->VerticalResolution; 131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeInfo (ModeData, *Info); 132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode ( 139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINT32 ModeNumber 141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol interface to set video mode 147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Arguments: 149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Protocol instance pointer. 150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeNumber - The mode number to be set. 151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Returns: 153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Graphics mode was changed. 154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_DEVICE_ERROR - The device had an error and could not complete the request. 155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_UNSUPPORTED - ModeNumber is not supported by this device. 156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private; 160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_MODE_DATA *ModeData; 161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// UINTN Count; 162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); 164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (ModeNumber >= This->Mode->MaxMode) { 166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_UNSUPPORTED; 167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ModeData = &Private->ModeData[ModeNumber]; 170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer) { 172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->LineBuffer); 173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution); 176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->LineBuffer == NULL) { 177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_OUT_OF_RESOURCES; 178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 180212aac55fd13e985cebf88042f40479c01ac2e44jljusten switch (Private->Variant) { 181212aac55fd13e985cebf88042f40479c01ac2e44jljusten case QEMU_VIDEO_CIRRUS_5430: 182212aac55fd13e985cebf88042f40479c01ac2e44jljusten case QEMU_VIDEO_CIRRUS_5446: 183cd1526101469cb639c7166c0b750c5ebb810a446Laszlo Ersek InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]); 184212aac55fd13e985cebf88042f40479c01ac2e44jljusten break; 185cdb4f5dcb1d4778da71c82cc15cab6e3cf218417jljusten case QEMU_VIDEO_BOCHS_MMIO: 18654f9b9accbcb6dc7f965342fc75b478464de21a3jljusten case QEMU_VIDEO_BOCHS: 187cd1526101469cb639c7166c0b750c5ebb810a446Laszlo Ersek InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]); 18854f9b9accbcb6dc7f965342fc75b478464de21a3jljusten break; 189212aac55fd13e985cebf88042f40479c01ac2e44jljusten default: 190212aac55fd13e985cebf88042f40479c01ac2e44jljusten ASSERT (FALSE); 191212aac55fd13e985cebf88042f40479c01ac2e44jljusten gBS->FreePool (Private->LineBuffer); 192212aac55fd13e985cebf88042f40479c01ac2e44jljusten Private->LineBuffer = NULL; 193212aac55fd13e985cebf88042f40479c01ac2e44jljusten return EFI_DEVICE_ERROR; 194212aac55fd13e985cebf88042f40479c01ac2e44jljusten } 195eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 196eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Mode = ModeNumber; 197eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution; 198eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; 199eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); 200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QemuVideoCompleteModeData (Private, This->Mode); 202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltLibConfigure ( 204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID*)(UINTN) This->Mode->FrameBufferBase, 205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This->Mode->Info 206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI 213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt ( 214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, 215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL 216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, 217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceX, 218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN SourceY, 219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationX, 220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN DestinationY, 221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Width, 222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Height, 223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten IN UINTN Delta 224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Graphics Output protocol instance to block transfer for CirrusLogic device 230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten This - Pointer to Graphics Output protocol instance 234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer - The data to transfer to screen 235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation - The operation to perform 236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX - The X coordinate of the source for BltOperation 237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY - The Y coordinate of the source for BltOperation 238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX - The X coordinate of the destination for BltOperation 239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY - The Y coordinate of the destination for BltOperation 240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width - The width of a rectangle in the blt rectangle in pixels 241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height - The height of a rectangle in the blt rectangle in pixels 242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation. 243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a Delta of 0 is used, the entire BltBuffer will be operated on. 244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten If a subrectangle of the BltBuffer is used, then Delta represents 245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten the number of bytes in a row of the BltBuffer. 246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_INVALID_PARAMETER - Invalid parameter passed in 250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_SUCCESS - Blt operation success 251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_TPL OriginalTPL; 256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We have to raise to TPL Notify, so we make an atomic write the frame buffer. 259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // We would not want a timer based event (Cursor, ...) to come in while we are 260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // doing this operation. 261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY); 263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten switch (BltOperation) { 265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToBltBuffer: 266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltBufferToVideo: 267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoFill: 268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten case EfiBltVideoToVideo: 269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = BltLibGopBlt ( 270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltBuffer, 271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten BltOperation, 272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceX, 273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten SourceY, 274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationX, 275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DestinationY, 276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Width, 277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Height, 278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Delta 279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten break; 281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten default: 283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = EFI_INVALID_PARAMETER; 284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ASSERT (FALSE); 285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->RestoreTPL (OriginalTPL); 288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor ( 294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_STATUS Status; 298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput = &Private->GraphicsOutput; 302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode; 303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->SetMode = QemuVideoGraphicsOutputSetMode; 304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten GraphicsOutput->Blt = QemuVideoGraphicsOutputBlt; 305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the private data 308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE), 312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode 313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return Status; 316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 317d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Status = gBS->AllocatePool ( 319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten EfiBootServicesData, 320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION), 321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten (VOID **) &Private->GraphicsOutput.Mode->Info 322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (EFI_ERROR (Status)) { 324d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek goto FreeMode; 325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode; 327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; 328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->LineBuffer = NULL; 329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // Initialize the hardware 332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten // 333d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek Status = GraphicsOutput->SetMode (GraphicsOutput, 0); 334d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek if (EFI_ERROR (Status)) { 335d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek goto FreeInfo; 336d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek } 337d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten DrawLogo ( 339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private, 340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution, 341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution 342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ); 343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 345d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 346d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo ErsekFreeInfo: 347d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek FreePool (Private->GraphicsOutput.Mode->Info); 348d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 349d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo ErsekFreeMode: 350d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek FreePool (Private->GraphicsOutput.Mode); 351d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek Private->GraphicsOutput.Mode = NULL; 352d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 353d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek return Status; 354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS 357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor ( 358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten QEMU_VIDEO_PRIVATE_DATA *Private 359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten ) 360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++ 361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 362eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description: 363eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 364eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments: 365eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 366eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns: 367eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 368eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten None 369eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 370eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/ 371eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{ 372d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek if (Private->LineBuffer != NULL) { 373d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek FreePool (Private->LineBuffer); 374d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek } 375d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek 376eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode != NULL) { 377eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten if (Private->GraphicsOutput.Mode->Info != NULL) { 378eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode->Info); 379eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 380eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten gBS->FreePool (Private->GraphicsOutput.Mode); 381eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten } 382eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 383eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten return EFI_SUCCESS; 384eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten} 385eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 386eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten 387