]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/x86/cpu/start.S
x86: ivybridge: Implement SDRAM init
[karo-tx-uboot.git] / arch / x86 / cpu / start.S
index ec12e8044fd92a6f4c8fcf24057bb19f3645324f..b0d0ac0610b158be02ac05327214e7219d2f0323 100644 (file)
@@ -7,28 +7,13 @@
  * (C) Copyright 2002
  * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <config.h>
 #include <version.h>
 #include <asm/global_data.h>
+#include <asm/post.h>
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <generated/generic-asm-offsets.h>
@@ -55,8 +40,18 @@ _x86boot_start:
        movl    %eax, %cr0
        wbinvd
 
+       /* Tell 32-bit code it is being entered from an in-RAM copy */
+       movw    $GD_FLG_WARM_BOOT, %bx
+       jmp     1f
 _start:
-       /* This is the 32-bit cold-reset entry point */
+       /*
+        * This is the 32-bit cold-reset entry point. Initialize %bx to 0
+        * in case we're preceeded by some sort of boot stub.
+        */
+       movw    $GD_FLG_COLD_BOOT, %bx
+1:
+       /* Save BIST */
+       movl    %eax, %ebp
 
        /* Load the segement registes to match the gdt loaded in start16.S */
        movl    $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
@@ -73,6 +68,7 @@ _start:
        jmp     early_board_init
 .globl early_board_init_ret
 early_board_init_ret:
+       post_code(POST_START)
 
        /* Initialise Cache-As-RAM */
        jmp     car_init
@@ -82,18 +78,37 @@ car_init_ret:
         * 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. 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
 
        /* Reserve space on stack for global data */
        subl    $GENERATED_GBL_DATA_SIZE, %esp
 
        /* Align global data to 16-byte boundary */
        andl    $0xfffffff0, %esp
+       post_code(POST_START_STACK)
+
+       /* Zero the global data since it won't happen later */
+       xorl    %eax, %eax
+       movl    $GENERATED_GBL_DATA_SIZE, %ecx
+       movl    %esp, %edi
+       rep     stosb
 
-       /* Setup first parameter to setup_gdt */
+       /* Setup first parameter to setup_gdt, pointer to global_data */
        movl    %esp, %eax
 
        /* Reserve space for global descriptor table */
@@ -101,19 +116,28 @@ car_init_ret:
 
        /* Align temporary global descriptor table to 16-byte boundary */
        andl    $0xfffffff0, %esp
+       movl    %esp, %ecx
+
+#if defined(CONFIG_SYS_MALLOC_F_LEN)
+       subl    $CONFIG_SYS_MALLOC_F_LEN, %esp
+       movl    %eax, %edx
+       addl    $GD_MALLOC_BASE, %edx
+       movl    %esp, (%edx)
+#endif
+       /* Store BIST */
+       movl    %eax, %edx
+       addl    $GD_BIST, %edx
+       movl    %ebp, (%edx)
 
        /* Set second parameter to setup_gdt */
-       movl    %esp, %edx
-
-       /* gd->gd_addr = gd (Required to allow gd->xyz to work) */
-       movl    %eax, (%eax)
+       movl    %ecx, %edx
 
        /* Setup global descriptor table so gd->xyz works */
        call    setup_gdt
 
        /* Set parameter to board_init_f() to boot flags */
+       post_code(POST_START_DONE)
        xorl    %eax, %eax
-       movw    %bx, %ax
 
        /* Enter, U-boot! */
        call    board_init_f
@@ -163,9 +187,6 @@ board_init_f_r_trampoline:
        /* Set second parameter to setup_gdt */
        movl    %esp, %edx
 
-       /* gd->gd_addr = gd (Required to allow gd->xyz to work) */
-       movl    %eax, (%eax)
-
        /* Setup global descriptor table so gd->xyz works */
        call    setup_gdt