summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>2021-04-08 19:56:11 +0300
committerTom Rini <trini@konsulko.com>2021-04-19 18:34:01 +0300
commit58b504e5e1f382891b8a58bb4103046c858c758e (patch)
tree01cc230e559458ea5c6567da2da69ef042f31e82 /common
parent3a9aaefcaa3efc2a1cef86fbe0bf229a1bff9902 (diff)
downloadu-boot-58b504e5e1f382891b8a58bb4103046c858c758e.tar.xz
Revert "spl: Drop bd_info in the data section"
This reverts commit 38d6b7ebdaee3e0e8426ef1b9df88bdce8ae2e75. struct global_data contains a pointer to the bd_info structure. This pointer was populated spl_set_bd() to a pre-allocated bd_info in the ".data" section. The referenced commit replaced this mechanism to one that uses malloc(). That new mechanism is only used if SPL_ALLOC_BD=y. which very few boards do. The result is that (struct global_data)->bd is NULL in SPL on most platforms. This breaks falcon mode, since arch_fixup_fdt() tries to access (struct global_data)->bd and set the "/memory" node in the devicetree. The result is that the "/memory" node contains garbage values, causing linux to panic() as it sets up the page table. Instead of trying to fix the mess, potentially causing other issues, revert to the code that worked, while this change is reworked. Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Diffstat (limited to 'common')
-rw-r--r--common/spl/Kconfig9
-rw-r--r--common/spl/spl.c20
2 files changed, 8 insertions, 21 deletions
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 0f528f346f..df5468f1ac 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -113,15 +113,6 @@ config SPL_FSL_PBL
Create boot binary having SPL binary in PBI format concatenated with
u-boot binary.
-config SPL_ALLOC_BD
- bool "Allocate memory for bd_info"
- default y if X86 || SANDBOX
- help
- Some boards don't allocate space for this in their board_init_f()
- code. In this case U-Boot can allocate space for gd->bd in the
- standard SPL flow (board_init_r()). Enable this option to support
- this feature.
-
endmenu
config HANDOFF
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 8c4cd933cf..a0a608fd77 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -55,6 +55,9 @@ binman_sym_declare(ulong, spl, image_pos);
binman_sym_declare(ulong, spl, size);
#endif
+/* Define board data structure */
+static struct bd_info bdata __attribute__ ((section(".data")));
+
/*
* Board-specific Platform code can reimplement show_boot_progress () if needed
*/
@@ -490,19 +493,14 @@ static int spl_common_init(bool setup_malloc)
return 0;
}
-int spl_alloc_bd(void)
+void spl_set_bd(void)
{
/*
* NOTE: On some platforms (e.g. x86) bdata may be in flash and not
* writeable.
*/
- if (!gd->bd) {
- gd->bd = malloc(sizeof(*gd->bd));
- if (!gd->bd)
- return -ENOMEM;
- }
-
- return 0;
+ if (!gd->bd)
+ gd->bd = &bdata;
}
int spl_early_init(void)
@@ -652,6 +650,8 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
+ spl_set_bd();
+
#if defined(CONFIG_SYS_SPL_MALLOC_START)
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
CONFIG_SYS_SPL_MALLOC_SIZE);
@@ -661,10 +661,6 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
if (spl_init())
hang();
}
- if (IS_ENABLED(CONFIG_SPL_ALLOC_BD) && spl_alloc_bd()) {
- puts("Cannot alloc bd\n");
- hang();
- }
#if !defined(CONFIG_PPC) && !defined(CONFIG_ARCH_MX6)
/*
* timer_init() does not exist on PPC systems. The timer is initialized