X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FQemuVideoDxe%2FGop.c;h=0c4dea7fb6f2f7f65e42b6d63081acb195c96152;hb=HEAD;hp=b479d24a87634a31c4d563dd542fa3ef637c7c8a;hpb=81feb6d3059d6dfdfecd47f6b1f0c7d2b9f66e65;p=mirror_edk2.git diff --git a/OvmfPkg/QemuVideoDxe/Gop.c b/OvmfPkg/QemuVideoDxe/Gop.c index b479d24a87..7a9fe208c9 100644 --- a/OvmfPkg/QemuVideoDxe/Gop.c +++ b/OvmfPkg/QemuVideoDxe/Gop.c @@ -3,116 +3,86 @@ Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
- This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include #include "Qemu.h" STATIC VOID QemuVideoCompleteModeInfo ( - IN QEMU_VIDEO_MODE_DATA *ModeData, + IN QEMU_VIDEO_MODE_DATA *ModeData, OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info ) { Info->Version = 0; if (ModeData->ColorDepth == 8) { - Info->PixelFormat = PixelBitMask; - Info->PixelInformation.RedMask = PIXEL_RED_MASK; - Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK; - Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK; + Info->PixelFormat = PixelBitMask; + Info->PixelInformation.RedMask = PIXEL_RED_MASK; + Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK; + Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK; Info->PixelInformation.ReservedMask = 0; } else if (ModeData->ColorDepth == 24) { - Info->PixelFormat = PixelBitMask; - Info->PixelInformation.RedMask = PIXEL24_RED_MASK; - Info->PixelInformation.GreenMask = PIXEL24_GREEN_MASK; - Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK; + Info->PixelFormat = PixelBitMask; + Info->PixelInformation.RedMask = PIXEL24_RED_MASK; + Info->PixelInformation.GreenMask = PIXEL24_GREEN_MASK; + Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK; Info->PixelInformation.ReservedMask = 0; } else if (ModeData->ColorDepth == 32) { - DEBUG ((EFI_D_INFO, "PixelBlueGreenRedReserved8BitPerColor\n")); - Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor; + DEBUG ((DEBUG_INFO, "PixelBlueGreenRedReserved8BitPerColor\n")); + Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor; + Info->PixelInformation.RedMask = 0; + Info->PixelInformation.GreenMask = 0; + Info->PixelInformation.BlueMask = 0; + Info->PixelInformation.ReservedMask = 0; + } else { + DEBUG ((DEBUG_ERROR, "%a: Invalid ColorDepth %u", __FUNCTION__, ModeData->ColorDepth)); + ASSERT (FALSE); } + Info->PixelsPerScanLine = Info->HorizontalResolution; } - STATIC EFI_STATUS QemuVideoCompleteModeData ( - IN QEMU_VIDEO_PRIVATE_DATA *Private, - OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode + IN QEMU_VIDEO_PRIVATE_DATA *Private, + OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode ) { EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc; - QEMU_VIDEO_MODE_DATA *ModeData; + QEMU_VIDEO_MODE_DATA *ModeData; ModeData = &Private->ModeData[Mode->Mode]; - Info = Mode->Info; + Info = Mode->Info; QemuVideoCompleteModeInfo (ModeData, Info); Private->PciIo->GetBarAttributes ( - Private->PciIo, - 0, - NULL, - (VOID**) &FrameBufDesc - ); + Private->PciIo, + Private->FrameBufferVramBarIndex, + NULL, + (VOID **)&FrameBufDesc + ); Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin; Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution; Mode->FrameBufferSize = Mode->FrameBufferSize * ((ModeData->ColorDepth + 7) / 8); - DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%Lx, FrameBufferSize: 0x%Lx\n", - Mode->FrameBufferBase, (UINT64)Mode->FrameBufferSize)); + Mode->FrameBufferSize = EFI_PAGES_TO_SIZE ( + EFI_SIZE_TO_PAGES (Mode->FrameBufferSize) + ); + DEBUG (( + DEBUG_INFO, + "FrameBufferBase: 0x%Lx, FrameBufferSize: 0x%Lx\n", + Mode->FrameBufferBase, + (UINT64)Mode->FrameBufferSize + )); FreePool (FrameBufDesc); return EFI_SUCCESS; } -STATIC -EFI_STATUS -QemuVideoVmwareSvgaCompleteModeData ( - IN QEMU_VIDEO_PRIVATE_DATA *Private, - OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode - ) -{ - EFI_STATUS Status; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc; - UINT32 BytesPerLine, FbOffset, BytesPerPixel; - - Info = Mode->Info; - CopyMem (Info, &Private->VmwareSvgaModeInfo[Mode->Mode], sizeof (*Info)); - BytesPerPixel = Private->ModeData[Mode->Mode].ColorDepth / 8; - BytesPerLine = Info->PixelsPerScanLine * BytesPerPixel; - - FbOffset = VmwareSvgaRead (Private, VmwareSvgaRegFbOffset); - - Status = Private->PciIo->GetBarAttributes ( - Private->PciIo, - PCI_BAR_IDX1, - NULL, - (VOID**) &FrameBufDesc - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin + FbOffset; - Mode->FrameBufferSize = BytesPerLine * Info->VerticalResolution; - - FreePool (FrameBufDesc); - return Status; -} - - // // Graphics Output Protocol Member Functions // @@ -124,6 +94,7 @@ QemuVideoGraphicsOutputQueryMode ( OUT UINTN *SizeOfInfo, OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info ) + /*++ Routine Description: @@ -150,7 +121,7 @@ Routine Description: Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); - if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) { + if ((Info == NULL) || (SizeOfInfo == NULL) || (ModeNumber >= This->Mode->MaxMode)) { return EFI_INVALID_PARAMETER; } @@ -161,14 +132,10 @@ Routine Description: *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); - if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) { - CopyMem (*Info, &Private->VmwareSvgaModeInfo[ModeNumber], sizeof (**Info)); - } else { - ModeData = &Private->ModeData[ModeNumber]; - (*Info)->HorizontalResolution = ModeData->HorizontalResolution; - (*Info)->VerticalResolution = ModeData->VerticalResolution; - QemuVideoCompleteModeInfo (ModeData, *Info); - } + ModeData = &Private->ModeData[ModeNumber]; + (*Info)->HorizontalResolution = ModeData->HorizontalResolution; + (*Info)->VerticalResolution = ModeData->VerticalResolution; + QemuVideoCompleteModeInfo (ModeData, *Info); return EFI_SUCCESS; } @@ -176,9 +143,10 @@ Routine Description: EFI_STATUS EFIAPI QemuVideoGraphicsOutputSetMode ( - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, - IN UINT32 ModeNumber + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, + IN UINT32 ModeNumber ) + /*++ Routine Description: @@ -196,10 +164,10 @@ Routine Description: --*/ { - QEMU_VIDEO_PRIVATE_DATA *Private; - QEMU_VIDEO_MODE_DATA *ModeData; - RETURN_STATUS Status; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Black; + QEMU_VIDEO_PRIVATE_DATA *Private; + QEMU_VIDEO_MODE_DATA *ModeData; + RETURN_STATUS Status; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Black; Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); @@ -210,41 +178,31 @@ Routine Description: ModeData = &Private->ModeData[ModeNumber]; switch (Private->Variant) { - case QEMU_VIDEO_CIRRUS_5430: - case QEMU_VIDEO_CIRRUS_5446: - InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]); - break; - case QEMU_VIDEO_BOCHS_MMIO: - case QEMU_VIDEO_BOCHS: - InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]); - break; - case QEMU_VIDEO_VMWARE_SVGA: - InitializeVmwareSvgaGraphicsMode ( - Private, - &QemuVideoBochsModes[ModeData->InternalModeIndex] - ); - break; - default: - ASSERT (FALSE); - return EFI_DEVICE_ERROR; + case QEMU_VIDEO_CIRRUS_5430: + case QEMU_VIDEO_CIRRUS_5446: + InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]); + break; + case QEMU_VIDEO_BOCHS_MMIO: + case QEMU_VIDEO_BOCHS: + InitializeBochsGraphicsMode (Private, ModeData); + break; + default: + ASSERT (FALSE); + return EFI_DEVICE_ERROR; } - This->Mode->Mode = ModeNumber; + This->Mode->Mode = ModeNumber; This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution; - This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; - This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; + This->Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); - if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) { - QemuVideoVmwareSvgaCompleteModeData (Private, This->Mode); - } else { - QemuVideoCompleteModeData (Private, This->Mode); - } + QemuVideoCompleteModeData (Private, This->Mode); // // Re-initialize the frame buffer configure when mode changes. // Status = FrameBufferBltConfigure ( - (VOID*) (UINTN) This->Mode->FrameBufferBase, + (VOID *)(UINTN)This->Mode->FrameBufferBase, This->Mode->Info, Private->FrameBufferBltConfigure, &Private->FrameBufferBltConfigureSize @@ -256,6 +214,7 @@ Routine Description: if (Private->FrameBufferBltConfigure != NULL) { FreePool (Private->FrameBufferBltConfigure); } + Private->FrameBufferBltConfigure = AllocatePool (Private->FrameBufferBltConfigureSize); ASSERT (Private->FrameBufferBltConfigure != NULL); @@ -264,12 +223,13 @@ Routine Description: // Create the configuration for FrameBufferBltLib // Status = FrameBufferBltConfigure ( - (VOID*) (UINTN) This->Mode->FrameBufferBase, - This->Mode->Info, - Private->FrameBufferBltConfigure, - &Private->FrameBufferBltConfigureSize - ); + (VOID *)(UINTN)This->Mode->FrameBufferBase, + This->Mode->Info, + Private->FrameBufferBltConfigure, + &Private->FrameBufferBltConfigureSize + ); } + ASSERT (Status == RETURN_SUCCESS); // @@ -280,9 +240,12 @@ Routine Description: Private->FrameBufferBltConfigure, &Black, EfiBltVideoFill, - 0, 0, - 0, 0, - This->Mode->Info->HorizontalResolution, This->Mode->Info->VerticalResolution, + 0, + 0, + 0, + 0, + This->Mode->Info->HorizontalResolution, + This->Mode->Info->VerticalResolution, 0 ); ASSERT_RETURN_ERROR (Status); @@ -293,17 +256,18 @@ Routine Description: EFI_STATUS EFIAPI QemuVideoGraphicsOutputBlt ( - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL - IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, + IN UINTN SourceX, + IN UINTN SourceY, + IN UINTN DestinationX, + IN UINTN DestinationY, + IN UINTN Width, + IN UINTN Height, + IN UINTN Delta ) + /*++ Routine Description: @@ -333,9 +297,9 @@ Returns: --*/ { - EFI_STATUS Status; - EFI_TPL OriginalTPL; - QEMU_VIDEO_PRIVATE_DATA *Private; + EFI_STATUS Status; + EFI_TPL OriginalTPL; + QEMU_VIDEO_PRIVATE_DATA *Private; Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This); // @@ -346,27 +310,27 @@ Returns: OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY); switch (BltOperation) { - case EfiBltVideoToBltBuffer: - case EfiBltBufferToVideo: - case EfiBltVideoFill: - case EfiBltVideoToVideo: - Status = FrameBufferBlt ( - Private->FrameBufferBltConfigure, - BltBuffer, - BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); - break; - - default: - Status = EFI_INVALID_PARAMETER; - ASSERT (FALSE); + case EfiBltVideoToBltBuffer: + case EfiBltBufferToVideo: + case EfiBltVideoFill: + case EfiBltVideoToVideo: + Status = FrameBufferBlt ( + Private->FrameBufferBltConfigure, + BltBuffer, + BltOperation, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); + break; + + default: + Status = EFI_INVALID_PARAMETER; + break; } gBS->RestoreTPL (OriginalTPL); @@ -379,9 +343,8 @@ QemuVideoGraphicsOutputConstructor ( QEMU_VIDEO_PRIVATE_DATA *Private ) { - EFI_STATUS Status; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - + EFI_STATUS Status; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; GraphicsOutput = &Private->GraphicsOutput; GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode; @@ -394,7 +357,7 @@ QemuVideoGraphicsOutputConstructor ( Status = gBS->AllocatePool ( EfiBootServicesData, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE), - (VOID **) &Private->GraphicsOutput.Mode + (VOID **)&Private->GraphicsOutput.Mode ); if (EFI_ERROR (Status)) { return Status; @@ -403,12 +366,13 @@ QemuVideoGraphicsOutputConstructor ( Status = gBS->AllocatePool ( EfiBootServicesData, sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION), - (VOID **) &Private->GraphicsOutput.Mode->Info + (VOID **)&Private->GraphicsOutput.Mode->Info ); if (EFI_ERROR (Status)) { goto FreeMode; } - Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode; + + Private->GraphicsOutput.Mode->MaxMode = (UINT32)Private->MaxMode; Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; Private->FrameBufferBltConfigure = NULL; Private->FrameBufferBltConfigureSize = 0; @@ -443,6 +407,7 @@ EFI_STATUS QemuVideoGraphicsOutputDestructor ( QEMU_VIDEO_PRIVATE_DATA *Private ) + /*++ Routine Description: @@ -463,10 +428,9 @@ Returns: if (Private->GraphicsOutput.Mode->Info != NULL) { gBS->FreePool (Private->GraphicsOutput.Mode->Info); } + gBS->FreePool (Private->GraphicsOutput.Mode); } return EFI_SUCCESS; } - -