123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- From 921c78f57a16b00debd58899a48e7045015c374b Mon Sep 17 00:00:00 2001
- From: Ard Biesheuvel <ardb@kernel.org>
- Date: Mon, 17 Jun 2024 17:07:41 +0200
- Subject: [PATCH] OvmfPkg/QemuVideoDxe: add feature PCD to remap framebuffer
- W/C
- Some platforms (such as SBSA-QEMU on recent builds of the emulator) only
- tolerate misaligned accesses to normal memory, and raise alignment
- faults on such accesses to device memory, which is the default for PCIe
- MMIO BARs.
- When emulating a PCIe graphics controller, the framebuffer is typically
- exposed via a MMIO BAR, while the disposition of the region is closer to
- memory (no side effects on reads or writes, except for the changing
- picture on the screen; direct random access to any pixel in the image).
- In order to permit the use of such controllers on platforms that only
- tolerate these types of accesses for normal memory, it is necessary to
- remap the memory. Use the DXE services to set the desired capabilities
- and attributes.
- Hide this behavior under a feature PCD so only platforms that really
- need it can enable it. (OVMF on x86 has no need for this)
- Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
- Upstream: https://github.com/tianocore/edk2/commit/c1d1910be6e04a8b1a73090cf2881fb698947a6e
- Signed-off-by: Romain Naour <romain.naour@smile.fr>
- ---
- OvmfPkg/OvmfPkg.dec | 5 +++++
- OvmfPkg/QemuVideoDxe/Gop.c | 19 +++++++++++++++++++
- OvmfPkg/QemuVideoDxe/Qemu.h | 2 +-
- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 4 ++++
- 4 files changed, 29 insertions(+), 1 deletion(-)
- diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
- index 51be9a5959..2c40de8a13 100644
- --- a/OvmfPkg/OvmfPkg.dec
- +++ b/OvmfPkg/OvmfPkg.dec
- @@ -444,3 +444,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 <Library/DxeServicesTableLib.h>
- +
- 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 57341a0bbf..a3da725fbf 100644
- --- a/OvmfPkg/QemuVideoDxe/Qemu.h
- +++ b/OvmfPkg/QemuVideoDxe/Qemu.h
- @@ -13,7 +13,7 @@
- #ifndef _QEMU_H_
- #define _QEMU_H_
-
- -#include <Uefi.h>
- +#include <PiDxe.h>
- #include <Protocol/GraphicsOutput.h>
- #include <Protocol/PciIo.h>
- #include <Protocol/DriverSupportedEfiVersion.h>
- diff --git a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf
- index 43a6e07faa..4c0870171b 100644
- --- a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf
- +++ b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf
- @@ -44,6 +44,7 @@
-
- [LibraryClasses]
- BaseMemoryLib
- + DxeServicesTableLib
- FrameBufferBltLib
- DebugLib
- DevicePathLib
- @@ -61,6 +62,9 @@
- gEfiDevicePathProtocolGuid # PROTOCOL BY_START
- gEfiPciIoProtocolGuid # PROTOCOL TO_START
-
- +[FeaturePcd]
- + gUefiOvmfPkgTokenSpaceGuid.PcdRemapFrameBufferWriteCombine
- +
- [Pcd]
- gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
- gUefiOvmfPkgTokenSpaceGuid.PcdVideoResolutionSource
- --
- 2.45.0
|