diff options
Diffstat (limited to 'OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c')
-rw-r--r-- | OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c | 224 |
1 files changed, 114 insertions, 110 deletions
diff --git a/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c b/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c index 4eaf7001b4..2fcc1dd56a 100644 --- a/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c +++ b/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c @@ -22,45 +22,48 @@ Abstract: #include "Gop.h"
#include <Library/FrameBufferBltLib.h>
+EFI_EVENT mGopScreenExitBootServicesEvent;
-EFI_EVENT mGopScreenExitBootServicesEvent;
-
-GOP_MODE_DATA mGopModeData[] = {
- { 0, 0, 32, 0 }, // Filled in with user-spec'd resolution
- { 1024, 768, 32, 0 },
- { 800, 600, 32, 0 },
- { 640, 480, 32, 0 }
- };
+GOP_MODE_DATA mGopModeData[] = {
+ { 0, 0, 32, 0 }, // Filled in with user-spec'd resolution
+ { 1024, 768, 32, 0 },
+ { 800, 600, 32, 0 },
+ { 640, 480, 32, 0 }
+};
STATIC
VOID
BhyveGopCompleteModeInfo (
- IN GOP_MODE_DATA *ModeData,
+ IN GOP_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 ((DEBUG_INFO, "%dx%d PixelBlueGreenRedReserved8BitPerColor\n",
- ModeData->HorizontalResolution, ModeData->VerticalResolution));
+ DEBUG ((
+ DEBUG_INFO,
+ "%dx%d PixelBlueGreenRedReserved8BitPerColor\n",
+ ModeData->HorizontalResolution,
+ ModeData->VerticalResolution
+ ));
Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;
}
+
Info->PixelsPerScanLine = Info->HorizontalResolution;
}
-
/**
Returns information for an available graphics mode that the graphics device
and the set of active video output devices supports.
@@ -91,7 +94,7 @@ EmuGopQuerytMode ( Private = GOP_PRIVATE_DATA_FROM_THIS (This);
- if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
+ if ((Info == NULL) || (SizeOfInfo == NULL) || ((UINTN)ModeNumber >= This->Mode->MaxMode)) {
return EFI_INVALID_PARAMETER;
}
@@ -102,18 +105,16 @@ EmuGopQuerytMode ( *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
- ModeData = &Private->ModeData[ModeNumber];
- (*Info)->Version = 0;
+ ModeData = &Private->ModeData[ModeNumber];
+ (*Info)->Version = 0;
(*Info)->HorizontalResolution = ModeData->HorizontalResolution;
(*Info)->VerticalResolution = ModeData->VerticalResolution;
- (*Info)->PixelFormat = PixelBitMask;
- (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
- BhyveGopCompleteModeInfo(ModeData, *Info);
+ (*Info)->PixelFormat = PixelBitMask;
+ (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
+ BhyveGopCompleteModeInfo (ModeData, *Info);
return EFI_SUCCESS;
}
-
-
/**
Set the video device into the specified mode and clears the visible portions of
the output display to black.
@@ -127,7 +128,7 @@ EmuGopQuerytMode ( **/
-FRAME_BUFFER_CONFIGURE *fbconf;
+FRAME_BUFFER_CONFIGURE *fbconf;
EFI_STATUS
EFIAPI
@@ -136,37 +137,38 @@ EmuGopSetMode ( IN UINT32 ModeNumber
)
{
- GOP_PRIVATE_DATA *Private;
- GOP_MODE_DATA *ModeData;
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
+ GOP_PRIVATE_DATA *Private;
+ GOP_MODE_DATA *ModeData;
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
- UINTN confsize = 0;
+ UINTN confsize = 0;
+
fbconf = NULL;
Private = GOP_PRIVATE_DATA_FROM_THIS (This);
if (ModeNumber >= This->Mode->MaxMode) {
// Tell bhyve that we are switching out of vesa
- BhyveSetGraphicsMode(Private, 0, 0, 0);
+ BhyveSetGraphicsMode (Private, 0, 0, 0);
return EFI_UNSUPPORTED;
}
DEBUG ((DEBUG_INFO, "BHYVE GopSetMode %d\n", ModeNumber));
- ModeData = &Private->ModeData[ModeNumber];
- This->Mode->Mode = ModeNumber;
+ ModeData = &Private->ModeData[ModeNumber];
+ This->Mode->Mode = ModeNumber;
Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
- Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
- Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
+ Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
Info = This->Mode->Info;
- BhyveGopCompleteModeInfo(ModeData, Info);
+ BhyveGopCompleteModeInfo (ModeData, Info);
This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
- This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
- This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
- This->Mode->FrameBufferBase = Private->GraphicsOutput.Mode->FrameBufferBase;
+ This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
+ This->Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+ This->Mode->FrameBufferBase = Private->GraphicsOutput.Mode->FrameBufferBase;
/*
This->Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution
@@ -175,18 +177,24 @@ EmuGopSetMode ( This->Mode->FrameBufferSize = Private->FbSize;
DEBUG ((DEBUG_INFO, "BHYVE GOP FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", This->Mode->FrameBufferBase, This->Mode->FrameBufferSize));
- BhyveSetGraphicsMode(Private, (UINT16)ModeData->HorizontalResolution, (UINT16)ModeData->VerticalResolution, (UINT16)ModeData->ColorDepth);
-
- RETURN_STATUS ret = FrameBufferBltConfigure (
- (VOID*)(UINTN) This->Mode->FrameBufferBase,
- This->Mode->Info, fbconf, &confsize
- );
- if (ret == EFI_BUFFER_TOO_SMALL || ret == EFI_INVALID_PARAMETER) {
- fbconf = AllocatePool(confsize);
- ret = FrameBufferBltConfigure(
- (VOID*)(UINTN)This->Mode->FrameBufferBase,
- This->Mode->Info, fbconf, &confsize);
- ASSERT(ret == EFI_SUCCESS);
+ BhyveSetGraphicsMode (Private, (UINT16)ModeData->HorizontalResolution, (UINT16)ModeData->VerticalResolution, (UINT16)ModeData->ColorDepth);
+
+ RETURN_STATUS ret = FrameBufferBltConfigure (
+ (VOID *)(UINTN)This->Mode->FrameBufferBase,
+ This->Mode->Info,
+ fbconf,
+ &confsize
+ );
+
+ if ((ret == EFI_BUFFER_TOO_SMALL) || (ret == EFI_INVALID_PARAMETER)) {
+ fbconf = AllocatePool (confsize);
+ ret = FrameBufferBltConfigure (
+ (VOID *)(UINTN)This->Mode->FrameBufferBase,
+ This->Mode->Info,
+ fbconf,
+ &confsize
+ );
+ ASSERT (ret == EFI_SUCCESS);
}
Fill.Red = 0;
@@ -207,8 +215,6 @@ EmuGopSetMode ( return EFI_SUCCESS;
}
-
-
/**
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
@@ -232,26 +238,26 @@ EmuGopSetMode ( EFI_STATUS
EFIAPI
EmuGopBlt (
- 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 OPTIONAL
+ 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 OPTIONAL
)
{
- EFI_TPL OriginalTPL;
- EFI_STATUS Status;
+ EFI_TPL OriginalTPL;
+ EFI_STATUS Status;
if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
return EFI_INVALID_PARAMETER;
}
- if (Width == 0 || Height == 0) {
+ if ((Width == 0) || (Height == 0)) {
return EFI_INVALID_PARAMETER;
}
@@ -263,27 +269,27 @@ EmuGopBlt ( OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
switch (BltOperation) {
- case EfiBltVideoToBltBuffer:
- case EfiBltBufferToVideo:
- case EfiBltVideoFill:
- case EfiBltVideoToVideo:
- Status = FrameBufferBlt (
- fbconf,
- 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 (
+ fbconf,
+ BltBuffer,
+ BltOperation,
+ SourceX,
+ SourceY,
+ DestinationX,
+ DestinationY,
+ Width,
+ Height,
+ Delta
+ );
+ break;
+
+ default:
+ Status = EFI_INVALID_PARAMETER;
+ ASSERT (FALSE);
}
gBS->RestoreTPL (OriginalTPL);
@@ -291,25 +297,24 @@ EmuGopBlt ( return Status;
}
-
//
// Construction and Destruction functions
//
EFI_STATUS
EmuGopConstructor (
- GOP_PRIVATE_DATA *Private
+ GOP_PRIVATE_DATA *Private
)
{
// Set mode 0 to be the requested resolution
- mGopModeData[0].HorizontalResolution = PcdGet32 ( PcdVideoHorizontalResolution);
- mGopModeData[0].VerticalResolution = PcdGet32 ( PcdVideoVerticalResolution );
+ mGopModeData[0].HorizontalResolution = PcdGet32 (PcdVideoHorizontalResolution);
+ mGopModeData[0].VerticalResolution = PcdGet32 (PcdVideoVerticalResolution);
Private->ModeData = mGopModeData;
- Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
- Private->GraphicsOutput.SetMode = EmuGopSetMode;
- Private->GraphicsOutput.Blt = EmuGopBlt;
+ Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
+ Private->GraphicsOutput.SetMode = EmuGopSetMode;
+ Private->GraphicsOutput.Blt = EmuGopBlt;
//
// Allocate buffer for Graphics Output Protocol mode information
@@ -318,35 +323,33 @@ EmuGopConstructor ( if (Private->GraphicsOutput.Mode == NULL) {
return EFI_OUT_OF_RESOURCES;
}
+
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
if (Private->GraphicsOutput.Mode->Info == NULL) {
return EFI_OUT_OF_RESOURCES;
}
-
DEBUG ((DEBUG_INFO, "BHYVE Gop Constructor\n"));
- Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
+ Private->GraphicsOutput.Mode->MaxMode = sizeof (mGopModeData) / sizeof (GOP_MODE_DATA);
//
// Till now, we have no idea about the window size.
//
- Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALID_MODE_NUMBER;
- Private->GraphicsOutput.Mode->Info->Version = 0;
+ Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALID_MODE_NUMBER;
+ Private->GraphicsOutput.Mode->Info->Version = 0;
Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
- Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
- Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBitMask;
- Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
- Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) Private->FbAddr;
- Private->GraphicsOutput.Mode->FrameBufferSize = Private->FbSize;
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
+ Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBitMask;
+ Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+ Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS)Private->FbAddr;
+ Private->GraphicsOutput.Mode->FrameBufferSize = Private->FbSize;
return EFI_SUCCESS;
}
-
-
EFI_STATUS
EmuGopDestructor (
- GOP_PRIVATE_DATA *Private
+ GOP_PRIVATE_DATA *Private
)
{
//
@@ -356,6 +359,7 @@ EmuGopDestructor ( if (Private->GraphicsOutput.Mode->Info != NULL) {
FreePool (Private->GraphicsOutput.Mode->Info);
}
+
FreePool (Private->GraphicsOutput.Mode);
Private->GraphicsOutput.Mode = NULL;
}
@@ -363,13 +367,13 @@ EmuGopDestructor ( return EFI_SUCCESS;
}
-
VOID
EFIAPI
ShutdownGopEvent (
IN EFI_EVENT Event,
IN VOID *Context
)
+
/*++
Routine Description:
|