x86: emulation: Set an MTRR for the RAM
authorSimon Glass <sjg@chromium.org>
Sat, 15 Mar 2025 14:25:47 +0000 (14:25 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 3 Apr 2025 17:41:55 +0000 (11:41 -0600)
QEMU likes to have an MTRR set up, just like real machines. Add an MTRR
which covers the total RAM size.

This does nothing on machines without MTRRs.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/qemu/dram.c

index 62a301c..ba3638e 100644 (file)
@@ -4,7 +4,9 @@
  */
 
 #include <init.h>
+#include <spl.h>
 #include <asm/global_data.h>
+#include <asm/mtrr.h>
 #include <asm/post.h>
 #include <asm/arch/qemu.h>
 #include <linux/sizes.h>
@@ -44,6 +46,22 @@ int dram_init(void)
        gd->ram_size += qemu_get_high_memory_size();
        post_code(POST_DRAM);
 
+       if (xpl_phase() == PHASE_BOARD_F) {
+               u64 total = gd->ram_size;
+               int ret;
+
+               if (total > SZ_2G + SZ_1G)
+                       total += SZ_1G;
+               ret = mtrr_add_request(MTRR_TYPE_WRBACK, 0, total);
+               if (ret != -ENOSYS) {
+                       if (ret)
+                               return log_msg_ret("mta", ret);
+                       ret = mtrr_commit(false);
+                       if (ret)
+                               return log_msg_ret("mtc", ret);
+               }
+       }
+
        return 0;
 }