]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board_f: Add a new struct to hold pre-relocation info
authorSimon Glass <sjg@chromium.org>
Wed, 21 Aug 2024 16:19:09 +0000 (10:19 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 26 Aug 2024 20:05:38 +0000 (14:05 -0600)
Quite a few of the members of struct global_data are only used before
reloction, or have little meaning afterwards, yet they hang around in
struct global_data for the lifetime of U-Boot. This uses up precious
pre-relocation SRAM on many boards.

To help with this, start a new struct which exists only before
relocation. Move new_fdt into this new struct. Drop the display of it
in the 'bdinfo' command as it is probably not very useful.

Note that the field does not exist in SPL builds.

Signed-off-by: Simon Glass <sjg@chromium.org>
cmd/bdinfo.c
common/board_f.c
include/asm-generic/global_data.h
include/board_f.h [new file with mode: 0644]
test/cmd/bdinfo.c

index 437ac4e86309c0d9d0877f6d2f26d68549167f75..b53b51acca4f2e7bff652e9b7c302c6c0edeed8b 100644 (file)
@@ -154,7 +154,6 @@ static int bdinfo_print_all(struct bd_info *bd)
        if (IS_ENABLED(CONFIG_CMD_NET))
                print_eth();
        bdinfo_print_num_l("fdt_blob", (ulong)map_to_sysmem(gd->fdt_blob));
-       bdinfo_print_num_l("new_fdt", (ulong)map_to_sysmem(gd->new_fdt));
        bdinfo_print_num_l("fdt_size", (ulong)gd->fdt_size);
        if (IS_ENABLED(CONFIG_VIDEO))
                show_video_info();
index a1f8641ae268da7e58a2f97da561812f23e98458..8f7c56e812fb904f8b7e448dc2a516f15d2ada6a 100644 (file)
@@ -578,7 +578,7 @@ static int reserve_fdt(void)
                        gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob), 32);
 
                        gd->start_addr_sp = reserve_stack_aligned(gd->fdt_size);
-                       gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size);
+                       gd->boardf->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size);
                        debug("Reserving %lu Bytes for FDT at: %08lx\n",
                              gd->fdt_size, gd->start_addr_sp);
                }
@@ -668,10 +668,10 @@ static int init_post(void)
 static int reloc_fdt(void)
 {
        if (!IS_ENABLED(CONFIG_OF_EMBED)) {
-               if (gd->new_fdt) {
-                       memcpy(gd->new_fdt, gd->fdt_blob,
+               if (gd->boardf->new_fdt) {
+                       memcpy(gd->boardf->new_fdt, gd->fdt_blob,
                               fdt_totalsize(gd->fdt_blob));
-                       gd->fdt_blob = gd->new_fdt;
+                       gd->fdt_blob = gd->boardf->new_fdt;
                }
        }
 
@@ -1021,8 +1021,11 @@ static const init_fnc_t init_sequence_f[] = {
 
 void board_init_f(ulong boot_flags)
 {
+       struct board_f boardf;
+
        gd->flags = boot_flags;
        gd->flags &= ~GD_FLG_HAVE_CONSOLE;
+       gd->boardf = &boardf;
 
        if (initcall_run_list(init_sequence_f))
                hang();
index 1252b8acefac3b52a06357668709d6d41ee53603..8a1a4e298acac29e081b8152690e1acf75e1775a 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #ifndef __ASSEMBLY__
+#include <board_f.h>
 #include <cyclic.h>
 #include <event_internal.h>
 #include <fdtdec.h>
@@ -42,6 +43,12 @@ struct global_data {
         * @bd: board information
         */
        struct bd_info *bd;
+#ifndef CONFIG_SPL_BUILD
+       /**
+        * @boardf: information only used before relocation
+        */
+       struct board_f *boardf;
+#endif
        /**
         * @flags: global data flags
         *
@@ -219,10 +226,6 @@ struct global_data {
         * @fdt_blob: U-Boot's own device tree, NULL if none
         */
        const void *fdt_blob;
-       /**
-        * @new_fdt: relocated device tree
-        */
-       void *new_fdt;
        /**
         * @fdt_size: space reserved for relocated device space
         */
diff --git a/include/board_f.h b/include/board_f.h
new file mode 100644 (file)
index 0000000..74fca6d
--- /dev/null
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2024 Google LLC
+ * Written by: Simon Glass <sjg@chromeium.org>
+ */
+
+#ifndef __BOARD_F
+#define __BOARD_F
+
+/**
+ * struct board_f: Information used only before relocation
+ *
+ * This struct is set up in board_init_f() and used to deal with relocation. It
+ * is not available after relocation.
+ */
+struct board_f {
+       /**
+        * @new_fdt: relocated device tree
+        */
+       void *new_fdt;
+};
+
+#endif
index 027848c3e24c0f5736e9d3919e54ffe5ca8056aa..60adc4aa960de2cb31ba37290f596abc76306bae 100644 (file)
@@ -185,8 +185,6 @@ static int bdinfo_test_all(struct unit_test_state *uts)
        ut_assert(map_to_sysmem(gd->fdt_blob) == env_get_hex("fdtcontroladdr", 0x1234));
        ut_assertok(test_num_l(uts, "fdt_blob",
                               (ulong)map_to_sysmem(gd->fdt_blob)));
-       ut_assertok(test_num_l(uts, "new_fdt",
-                              (ulong)map_to_sysmem(gd->new_fdt)));
        ut_assertok(test_num_l(uts, "fdt_size", (ulong)gd->fdt_size));
 
        if (IS_ENABLED(CONFIG_VIDEO))