diff --git a/boot/edk2/0001-OvmfPkg-QemuVideoDxe-add-feature-PCD-to-remap-frameb.patch b/boot/edk2/0001-OvmfPkg-QemuVideoDxe-add-feature-PCD-to-remap-frameb.patch new file mode 100644 index 0000000000..5f6ceb289d --- /dev/null +++ b/boot/edk2/0001-OvmfPkg-QemuVideoDxe-add-feature-PCD-to-remap-frameb.patch @@ -0,0 +1,129 @@ +From 921c78f57a16b00debd58899a48e7045015c374b Mon Sep 17 00:00:00 2001 +From: Ard Biesheuvel +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 +Upstream: https://github.com/tianocore/edk2/commit/c1d1910be6e04a8b1a73090cf2881fb698947a6e +Signed-off-by: Romain Naour +--- + 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 ++ + 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 ++#include + #include + #include + #include +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 + diff --git a/boot/edk2/edk2.hash b/boot/edk2/edk2.hash index f7daa8ddf3..abcf3c6b8e 100644 --- a/boot/edk2/edk2.hash +++ b/boot/edk2/edk2.hash @@ -1,3 +1,3 @@ # Locally calculated -sha256 6bdfdffcc2235a117b3f9d4124da63103f19ff30157673f812e1093b20ebb7ad edk2-edk2-stable202308-git4.tar.gz +sha256 4595b9d9d14c06bd03f575e4b7623574a4a874ef465652ecdc224099a5b14fc7 edk2-edk2-stable202405-git4.tar.gz sha256 50ce20c9cfdb0e19ee34fe0a51fc0afe961f743697b068359ab2f862b494df80 License.txt diff --git a/boot/edk2/edk2.mk b/boot/edk2/edk2.mk index e5816b353a..145a9a80ae 100644 --- a/boot/edk2/edk2.mk +++ b/boot/edk2/edk2.mk @@ -4,7 +4,7 @@ # ################################################################################ -EDK2_VERSION = edk2-stable202308 +EDK2_VERSION = edk2-stable202405 EDK2_SITE = https://github.com/tianocore/edk2 EDK2_SITE_METHOD = git EDK2_LICENSE = BSD-2-Clause-Patent diff --git a/package/edk2-platforms/edk2-platforms.hash b/package/edk2-platforms/edk2-platforms.hash index 4c74c7dfb6..0095d4298d 100644 --- a/package/edk2-platforms/edk2-platforms.hash +++ b/package/edk2-platforms/edk2-platforms.hash @@ -1,3 +1,3 @@ # Locally calculated -sha256 c240a8ec7816bc5963d881c84eb18d880e9269c117cfc46a3106b0c5e6e80c66 edk2-platforms-e509ac5a729ebe2a3bc905aed1df23226aca4dc9.tar.gz +sha256 41fa720ac644ec0523c576ff28eba5e0308c9649111ce42f7d408b8d8b30eaf5 edk2-platforms-3f08401365d67e10924c774e6c3f64be56bc15b6.tar.gz sha256 50ce20c9cfdb0e19ee34fe0a51fc0afe961f743697b068359ab2f862b494df80 License.txt diff --git a/package/edk2-platforms/edk2-platforms.mk b/package/edk2-platforms/edk2-platforms.mk index 7bd86ff159..23d9221649 100644 --- a/package/edk2-platforms/edk2-platforms.mk +++ b/package/edk2-platforms/edk2-platforms.mk @@ -5,7 +5,7 @@ ################################################################################ # Keep in sync with latest commit as of the release date for boot/edk2 -EDK2_PLATFORMS_VERSION = e509ac5a729ebe2a3bc905aed1df23226aca4dc9 +EDK2_PLATFORMS_VERSION = 3f08401365d67e10924c774e6c3f64be56bc15b6 EDK2_PLATFORMS_SITE = $(call github,tianocore,edk2-platforms,$(EDK2_PLATFORMS_VERSION)) EDK2_PLATFORMS_LICENSE = BSD-2-Clause-Patent EDK2_PLATFORMS_LICENSE_FILES = License.txt