diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index e1ef8420ce..c1c8198061 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -449,3 +449,8 @@ ## This feature flag indicates the firmware build supports secure boot. gUefiOvmfPkgTokenSpaceGuid.PcdSecureBootSupported|FALSE|BOOLEAN|0x6d + + ## Whether QemuVideoDxe should perform a EFI_MEMORY_WC remap of the PCI + # framebuffer. This might be required on platforms that do not tolerate + # misaligned accesses otherwise. + gUefiOvmfPkgTokenSpaceGuid.PcdRemapFrameBufferWriteCombine|FALSE|BOOLEAN|0x75 diff --git a/OvmfPkg/QemuVideoDxe/Gop.c b/OvmfPkg/QemuVideoDxe/Gop.c index b11eed7558..a29c025afd 100644 --- a/OvmfPkg/QemuVideoDxe/Gop.c +++ b/OvmfPkg/QemuVideoDxe/Gop.c @@ -9,6 +9,8 @@ #include "Qemu.h" +#include + STATIC VOID QemuVideoCompleteModeInfo ( @@ -54,6 +56,7 @@ QemuVideoCompleteModeData ( EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc; QEMU_VIDEO_MODE_DATA *ModeData; + EFI_STATUS Status; ModeData = &Private->ModeData[Mode->Mode]; Info = Mode->Info; @@ -79,6 +82,22 @@ QemuVideoCompleteModeData ( (UINT64)Mode->FrameBufferSize )); + if (FeaturePcdGet (PcdRemapFrameBufferWriteCombine)) { + Status = gDS->SetMemorySpaceCapabilities ( + FrameBufDesc->AddrRangeMin, + FrameBufDesc->AddrLen, + EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_XP + ); + ASSERT_EFI_ERROR (Status); + + Status = gDS->SetMemorySpaceAttributes ( + FrameBufDesc->AddrRangeMin, + FrameBufDesc->AddrLen, + EFI_MEMORY_WC | EFI_MEMORY_XP + ); + ASSERT_EFI_ERROR (Status); + } + FreePool (FrameBufDesc); return EFI_SUCCESS; } diff --git a/OvmfPkg/QemuVideoDxe/Qemu.h b/OvmfPkg/QemuVideoDxe/Qemu.h index bd6198dd50..3a190ae0b1 100644 --- a/OvmfPkg/QemuVideoDxe/Qemu.h +++ b/OvmfPkg/QemuVideoDxe/Qemu.h @@ -13,7 +13,7 @@ #ifndef _QEMU_H_ #define _QEMU_H_ -#include +#include #include #include #include diff --git a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf index 6b7baa8525..4f11365423 100644 --- a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf +++ b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf @@ -40,6 +40,7 @@ [LibraryClasses] BaseMemoryLib + DxeServicesTableLib FrameBufferBltLib DebugLib DevicePathLib @@ -57,6 +58,9 @@ gEfiDevicePathProtocolGuid # PROTOCOL BY_START gEfiPciIoProtocolGuid # PROTOCOL TO_START +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdRemapFrameBufferWriteCombine + [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId gUefiOvmfPkgTokenSpaceGuid.PcdVideoResolutionSource