From: Pali Rohár <[email protected]>

When U-Boot is running from flash memory (execute in place) then
gd->fdt_blob before relocation points to read-only flash memory.

So U-Boot calls board_fix_fdt() with read-only gd->fdt_blob pointer which
cause immediate CPU crash when callback is trying to modify gd->fdt_blob.

Fix this issue by introducing a new config option
OF_DTB_READONLY_BEFORE_RELOC which moves fix_fdt callback after the
reloc_fdt callback. This makes CONFIG_OF_BOARD_FIXUP working also if
U-Boot before relocation is not running from read/write (S)RAM memory.

This is required for mpc85xx boards when booting from flash NOR.

Signed-off-by: Pali Rohár <[email protected]>
Signed-off-by: Marek Behún <[email protected]>
---
Changes since v1:
- just changed the new Kconfig option name and associated help string
---
 common/board_f.c | 8 +++++++-
 dts/Kconfig      | 6 ++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/common/board_f.c b/common/board_f.c
index 18e2246733..35fb4a0753 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -911,7 +911,7 @@ static const init_fnc_t init_sequence_f[] = {
         *  - board info struct
         */
        setup_dest_addr,
-#ifdef CONFIG_OF_BOARD_FIXUP
+#if defined(CONFIG_OF_BOARD_FIXUP) && 
!defined(CONFIG_OF_DTB_READONLY_BEFORE_RELOC)
        fix_fdt,
 #endif
 #ifdef CONFIG_PRAM
@@ -926,6 +926,10 @@ static const init_fnc_t init_sequence_f[] = {
        reserve_board,
        reserve_global_data,
        reserve_fdt,
+#if defined(CONFIG_OF_BOARD_FIXUP) && 
defined(CONFIG_OF_DTB_READONLY_BEFORE_RELOC)
+       reloc_fdt,
+       fix_fdt,
+#endif
        reserve_bootstage,
        reserve_bloblist,
        reserve_arch,
@@ -936,7 +940,9 @@ static const init_fnc_t init_sequence_f[] = {
        setup_bdinfo,
        display_new_sp,
        INIT_FUNC_WATCHDOG_RESET
+#if !defined(CONFIG_OF_BOARD_FIXUP) || 
!defined(CONFIG_OF_DTB_READONLY_BEFORE_RELOC)
        reloc_fdt,
+#endif
        reloc_bootstage,
        reloc_bloblist,
        setup_reloc,
diff --git a/dts/Kconfig b/dts/Kconfig
index bc5f22029f..29e5248b15 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -105,6 +105,12 @@ config OF_EMBED
 
 endchoice
 
+config OF_DTB_READONLY_BEFORE_RELOC
+       bool "Initial DTB (before relocation) for DT control is read-only"
+       help
+         If initial (before relocation) DTB for DT control is read-only,
+         (e.g. points to memory-mapped flash memory), set this option.
+
 config OF_BOARD
        bool "Provided by the board (e.g a previous loader) at runtime"
        default y if SANDBOX || OF_HAS_PRIOR_STAGE
-- 
2.35.1

Reply via email to