spl: Allow distinguishing between two phases in U-Boot
authorSimon Glass <sjg@chromium.org>
Wed, 25 Sep 2019 14:56:30 +0000 (08:56 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Tue, 8 Oct 2019 05:57:45 +0000 (13:57 +0800)
U-Boot has two distinct phases: before and after relocation. These are
commonly referred to as F (running from Flash) and R (Relocated and
running from RAM). Some drivers want to do different things in these
phases so update the SPL phase function to return a different value for
each.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
include/spl.h

index 9be8d0ddcf645a887e55716befa5ca88d4532df8..c7cc2b0767cfcb18a76a49b5bd65eabedf2ef155 100644 (file)
@@ -50,9 +50,10 @@ static inline bool u_boot_first_phase(void)
 }
 
 enum u_boot_phase {
-       PHASE_TPL,
-       PHASE_SPL,
-       PHASE_U_BOOT,
+       PHASE_TPL,      /* Running in TPL */
+       PHASE_SPL,      /* Running in SPL */
+       PHASE_BOARD_F,  /* Running in U-Boot before relocation */
+       PHASE_BOARD_R,  /* Running in U-Boot after relocation */
 };
 
 /**
@@ -92,7 +93,7 @@ enum u_boot_phase {
  *
  * but with this you can use:
  *
- *    if (spl_phase() == PHASE_U_BOOT) {
+ *    if (spl_phase() == PHASE_BOARD_F) {
  *       ...
  *    }
  *
@@ -105,7 +106,12 @@ static inline enum u_boot_phase spl_phase(void)
 #elif CONFIG_SPL_BUILD
        return PHASE_SPL;
 #else
-       return PHASE_U_BOOT;
+       DECLARE_GLOBAL_DATA_PTR;
+
+       if (!(gd->flags & GD_FLG_RELOC))
+               return PHASE_BOARD_F;
+       else
+               return PHASE_BOARD_R;
 #endif
 }