OvmfPkg/VirtioGpuDxe: move code to GopInitialize

Add new function to initialize the GOP, move over setup code.  Handle
initialization first, specifically before calling GopQueryMode(), so
GopQueryMode is never called before GopInitialize() did complete.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Gerd Hoffmann 2022-04-08 10:23:32 +02:00 committed by mergify[bot]
parent 5f6ecaa398
commit 86de090b99
1 changed files with 32 additions and 15 deletions

View File

@ -192,6 +192,32 @@ STATIC CONST GOP_RESOLUTION mGopResolutions[] = {
#define VGPU_GOP_FROM_GOP(GopPointer) \
CR (GopPointer, VGPU_GOP, Gop, VGPU_GOP_SIG)
STATIC
VOID
EFIAPI
GopInitialize (
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This
)
{
VGPU_GOP *VgpuGop;
VgpuGop = VGPU_GOP_FROM_GOP (This);
//
// Set up the Gop -> GopMode -> GopModeInfo pointer chain, and the other
// (nonzero) constant fields.
//
// No direct framebuffer access is supported, only Blt() is.
//
VgpuGop->Gop.Mode = &VgpuGop->GopMode;
VgpuGop->GopMode.MaxMode = (UINT32)(ARRAY_SIZE (mGopResolutions));
VgpuGop->GopMode.Info = &VgpuGop->GopModeInfo;
VgpuGop->GopMode.SizeOfInfo = sizeof VgpuGop->GopModeInfo;
VgpuGop->GopModeInfo.PixelFormat = PixelBltOnly;
}
//
// EFI_GRAPHICS_OUTPUT_PROTOCOL member functions.
//
@ -207,7 +233,7 @@ GopQueryMode (
{
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GopModeInfo;
if (ModeNumber >= ARRAY_SIZE (mGopResolutions)) {
if (ModeNumber >= This->Mode->MaxMode) {
return EFI_INVALID_PARAMETER;
}
@ -247,6 +273,11 @@ GopSetMode (
EFI_STATUS Status;
EFI_STATUS Status2;
if (!This->Mode) {
// SetMode() call in InitVgpuGop() triggers this.
GopInitialize (This);
}
Status = GopQueryMode (This, ModeNumber, &SizeOfInfo, &GopModeInfo);
if (Status != EFI_SUCCESS) {
return Status;
@ -259,20 +290,6 @@ GopSetMode (
// calls.
//
if (VgpuGop->ResourceId == 0) {
//
// Set up the Gop -> GopMode -> GopModeInfo pointer chain, and the other
// (nonzero) constant fields.
//
// No direct framebuffer access is supported, only Blt() is.
//
VgpuGop->Gop.Mode = &VgpuGop->GopMode;
VgpuGop->GopMode.MaxMode = (UINT32)(ARRAY_SIZE (mGopResolutions));
VgpuGop->GopMode.Info = &VgpuGop->GopModeInfo;
VgpuGop->GopMode.SizeOfInfo = sizeof VgpuGop->GopModeInfo;
VgpuGop->GopModeInfo.PixelFormat = PixelBltOnly;
//
// This is the first time we create a host side resource.
//