ARM: zynq: Do not select options if SPL is not enabled
[oweals/u-boot.git] / common / spl / spl.c
index 7a393dc078291d3fec81b88cf4c17cebaa4e27d1..e5167bf73e4c3181ef7c74b7736431e0df121668 100644 (file)
@@ -431,8 +431,13 @@ void preloader_console_init(void)
  * more stack space for things like the MMC sub-system.
  *
  * This function calculates the stack position, copies the global_data into
- * place and returns the new stack position. The caller is responsible for
- * setting up the sp register.
+ * place, sets the new gd (except for ARM, for which setting GD within a C
+ * function may not always work) and returns the new stack position. The
+ * caller is responsible for setting up the sp register and, in the case
+ * of ARM, setting up gd.
+ *
+ * All of this is done using the same layout and alignments as done in
+ * board_init_f_init_reserve() / board_init_f_alloc_reserve().
  *
  * @return new stack location, or 0 to use the same stack
  */
@@ -440,19 +445,12 @@ ulong spl_relocate_stack_gd(void)
 {
 #ifdef CONFIG_SPL_STACK_R
        gd_t *new_gd;
-       ulong ptr;
-
-       /* Get stack position: use 8-byte alignment for ABI compliance */
-       ptr = CONFIG_SPL_STACK_R_ADDR - sizeof(gd_t);
-       ptr &= ~7;
-       new_gd = (gd_t *)ptr;
-       memcpy(new_gd, (void *)gd, sizeof(gd_t));
-       gd = new_gd;
+       ulong ptr = CONFIG_SPL_STACK_R_ADDR;
 
 #ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
        if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
                if (!(gd->flags & GD_FLG_SPL_INIT))
-                       panic("spl_init must be called before heap reloc");
+                       panic_str("spl_init must be called before heap reloc");
 
                ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
                gd->malloc_base = ptr;
@@ -460,7 +458,13 @@ ulong spl_relocate_stack_gd(void)
                gd->malloc_ptr = 0;
        }
 #endif
-
+       /* Get stack position: use 8-byte alignment for ABI compliance */
+       ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
+       new_gd = (gd_t *)ptr;
+       memcpy(new_gd, (void *)gd, sizeof(gd_t));
+#if !defined(CONFIG_ARM)
+       gd = new_gd;
+#endif
        return ptr;
 #else
        return 0;