new file mode 100644
@@ -0,0 +1,129 @@
+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
+
@@ -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
@@ -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
@@ -1,3 +1,3 @@
# Locally calculated
-sha256 c240a8ec7816bc5963d881c84eb18d880e9269c117cfc46a3106b0c5e6e80c66 edk2-platforms-e509ac5a729ebe2a3bc905aed1df23226aca4dc9.tar.gz
+sha256 41fa720ac644ec0523c576ff28eba5e0308c9649111ce42f7d408b8d8b30eaf5 edk2-platforms-3f08401365d67e10924c774e6c3f64be56bc15b6.tar.gz
sha256 50ce20c9cfdb0e19ee34fe0a51fc0afe961f743697b068359ab2f862b494df80 License.txt
@@ -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