]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/x86/cpu/start.S
x86: Support Intel FSP initialization path in start.S
[karo-tx-uboot.git] / arch / x86 / cpu / start.S
index 1b738f9916708c41ef176aaf79e2fa87f51e2aa0..125782cf2796768bf281dc204f75355686b7827c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  U-boot - x86 Startup Code
+ *  U-Boot - x86 Startup Code
  *
  * (C) Copyright 2008-2011
  * Graeme Russ, <graeme.russ@gmail.com>
@@ -17,6 +17,7 @@
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <generated/generic-asm-offsets.h>
+#include <generated/asm-offsets.h>
 
 .section .text
 .code32
@@ -74,24 +75,33 @@ early_board_init_ret:
        jmp     car_init
 .globl car_init_ret
 car_init_ret:
+#ifndef CONFIG_HAVE_FSP
        /*
         * We now have CONFIG_SYS_CAR_SIZE bytes of Cache-As-RAM (or SRAM,
         * or fully initialised SDRAM - we really don't care which)
         * starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack
-        * and early malloc area.
+        * and early malloc area. The MRC requires some space at the top.
         *
         * Stack grows down from top of CAR. We have:
         *
         * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
+        *      MRC area
         *      global_data
         *      x86 global descriptor table
         *      early malloc area
         *      stack
         * bottom-> CONFIG_SYS_CAR_ADDR
         */
-
-       /* Stack grows down from top of CAR */
-       movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE), %esp
+       movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE - 4), %esp
+#ifdef CONFIG_DCACHE_RAM_MRC_VAR_SIZE
+       subl    $CONFIG_DCACHE_RAM_MRC_VAR_SIZE, %esp
+#endif
+#else
+       /*
+        * When we get here after car_init, esp points to a temporary stack
+        * and esi holds the HOB list address returned by the FSP.
+        */
+#endif
 
        /* Reserve space on stack for global data */
        subl    $GENERATED_GBL_DATA_SIZE, %esp
@@ -106,6 +116,13 @@ car_init_ret:
        movl    %esp, %edi
        rep     stosb
 
+#ifdef CONFIG_HAVE_FSP
+       /* Store HOB list */
+       movl    %esp, %edx
+       addl    $GD_HOB_LIST, %edx
+       movl    %esi, (%edx)
+#endif
+
        /* Setup first parameter to setup_gdt, pointer to global_data */
        movl    %esp, %eax