OvmfPkg/VirtioGpuDxe: use GopQueryMode in GopSetMode

Call GopQueryMode() in GopSetMode(), use the ModeInfo returned when
setting the mode.  This is needed to properly handle modes which are
not on the static mGopResolutions list.

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:31 +02:00 committed by mergify[bot]
parent 82c07f2cc7
commit 5f6ecaa398
1 changed files with 31 additions and 29 deletions

View File

@ -241,12 +241,15 @@ GopSetMode (
VOID *NewBackingStore;
EFI_PHYSICAL_ADDRESS NewBackingStoreDeviceAddress;
VOID *NewBackingStoreMap;
UINTN SizeOfInfo;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GopModeInfo;
EFI_STATUS Status;
EFI_STATUS Status2;
if (ModeNumber >= ARRAY_SIZE (mGopResolutions)) {
return EFI_UNSUPPORTED;
Status = GopQueryMode (This, ModeNumber, &SizeOfInfo, &GopModeInfo);
if (Status != EFI_SUCCESS) {
return Status;
}
VgpuGop = VGPU_GOP_FROM_GOP (This);
@ -292,8 +295,8 @@ GopSetMode (
VgpuGop->ParentBus, // VgpuDev
NewResourceId, // ResourceId
VirtioGpuFormatB8G8R8X8Unorm, // Format
mGopResolutions[ModeNumber].Width, // Width
mGopResolutions[ModeNumber].Height // Height
GopModeInfo->HorizontalResolution, // Width
GopModeInfo->VerticalResolution // Height
);
if (EFI_ERROR (Status)) {
return Status;
@ -303,8 +306,8 @@ GopSetMode (
// Allocate, zero and map guest backing store, for bus master common buffer
// operation.
//
NewNumberOfBytes = mGopResolutions[ModeNumber].Width *
mGopResolutions[ModeNumber].Height * sizeof (UINT32);
NewNumberOfBytes = GopModeInfo->HorizontalResolution *
GopModeInfo->VerticalResolution * sizeof (UINT32);
NewNumberOfPages = EFI_SIZE_TO_PAGES (NewNumberOfBytes);
Status = VirtioGpuAllocateZeroAndMapBackingStore (
VgpuGop->ParentBus, // VgpuDev
@ -337,8 +340,8 @@ GopSetMode (
VgpuGop->ParentBus, // VgpuDev
0, // X
0, // Y
mGopResolutions[ModeNumber].Width, // Width
mGopResolutions[ModeNumber].Height, // Height
GopModeInfo->HorizontalResolution, // Width
GopModeInfo->VerticalResolution, // Height
0, // ScanoutId
NewResourceId // ResourceId
);
@ -356,8 +359,8 @@ GopSetMode (
VgpuGop->ParentBus, // VgpuDev
0, // X
0, // Y
mGopResolutions[ModeNumber].Width, // Width
mGopResolutions[ModeNumber].Height, // Height
GopModeInfo->HorizontalResolution, // Width
GopModeInfo->VerticalResolution, // Height
NewResourceId // ResourceId
);
if (EFI_ERROR (Status)) {
@ -370,8 +373,8 @@ GopSetMode (
VgpuGop->ParentBus, // VgpuDev
0, // X
0, // Y
mGopResolutions[This->Mode->Mode].Width, // Width
mGopResolutions[This->Mode->Mode].Height, // Height
VgpuGop->GopModeInfo.HorizontalResolution, // Width
VgpuGop->GopModeInfo.VerticalResolution, // Height
0, // ScanoutId
VgpuGop->ResourceId // ResourceId
);
@ -407,10 +410,8 @@ GopSetMode (
// Populate Mode and ModeInfo (mutable fields only).
//
VgpuGop->GopMode.Mode = ModeNumber;
VgpuGop->GopModeInfo.HorizontalResolution =
mGopResolutions[ModeNumber].Width;
VgpuGop->GopModeInfo.VerticalResolution = mGopResolutions[ModeNumber].Height;
VgpuGop->GopModeInfo.PixelsPerScanLine = mGopResolutions[ModeNumber].Width;
VgpuGop->GopModeInfo = *GopModeInfo;
FreePool (GopModeInfo);
return EFI_SUCCESS;
DetachBackingStore:
@ -435,6 +436,7 @@ DestroyHostResource:
CpuDeadLoop ();
}
FreePool (GopModeInfo);
return Status;
}