On the ARM Virt platform, QEMU places its device tree at the start of
RAM and doesn't provide a standard FW_CFG to access it.

To be able to keep reusing it when chainloading barebox in future and
passing it to the kernel, reserve this piece of memory.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 common/boards/qemu-virt/board.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/common/boards/qemu-virt/board.c b/common/boards/qemu-virt/board.c
index 0c9cc1a75d3b..53945aefb7aa 100644
--- a/common/boards/qemu-virt/board.c
+++ b/common/boards/qemu-virt/board.c
@@ -6,6 +6,8 @@
 #include <common.h>
 #include <init.h>
 #include <of.h>
+#include <memory.h>
+#include <compressed-dtb.h>
 #include <deep-probe.h>
 #include <security/policy.h>
 #include "qemu-virt-flash.h"
@@ -47,6 +49,8 @@ static const struct of_device_id virt_of_match[] = {
 };
 BAREBOX_DEEP_PROBE_ENABLE(virt_of_match);
 
+static bool is_qemu_virt;
+
 /*
  * We don't have a dedicated qemu-virt device tree and instead rely
  * on what Qemu passes us. To be able to get fundamental changes
@@ -64,6 +68,8 @@ static int virt_board_driver_init(void)
        if (!id)
                return 0;
 
+       is_qemu_virt = true;
+
        if (id->data) {
                init = id->data;
                init();
@@ -94,3 +100,29 @@ static int virt_board_driver_init(void)
        return 0;
 }
 postcore_initcall(virt_board_driver_init);
+
+static __maybe_unused int virt_board_reserve_fdt(void)
+{
+       resource_size_t start = ~0, end = ~0;
+
+       if (!is_qemu_virt)
+               return 0;
+
+       memory_bank_first_find_space(&start, &end);
+       if (start != ~0) {
+               void *fdt = (void *)start;
+
+               if (!blob_is_fdt(fdt))
+                       return 0;
+
+               request_sdram_region("qemu-virt-fdt", start,
+                                    fdt_totalsize(fdt),
+                                    MEMTYPE_BOOT_SERVICES_DATA,
+                                    MEMATTRS_RO);
+       }
+
+       return 0;
+}
+#ifdef CONFIG_ARM
+postmem_initcall(virt_board_reserve_fdt);
+#endif
-- 
2.47.3


Reply via email to