]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/x86/cpu/start.S
x86: Set APs' req_seq to the reg number from device tree
[karo-tx-uboot.git] / arch / x86 / cpu / start.S
index e960e21f6e49d88979b3b502e163f646920dc41d..e94ddc45ddb78475eefa3e306b9f352d1f378755 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>
@@ -7,31 +7,16 @@
  * (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>
+#include <generated/asm-offsets.h>
 
 .section .text
 .code32
 .globl _x86boot_start
 _x86boot_start:
        /*
-        * This is the fail safe 32-bit bootstrap entry point. The
-        * following code is not executed from a cold-reset (actually, a
-        * lot of it is, but from real-mode after cold reset. It is
-        * repeated here to put the board into a state as close to cold
-        * reset as necessary)
+        * This is the fail-safe 32-bit bootstrap entry point.
+        *
+        * This code is used when booting from another boot loader like
+        * coreboot or EFI. So we repeat some of the same init found in
+        * start16.
         */
        cli
        cld
@@ -56,17 +41,34 @@ _x86boot_start:
        wbinvd
 
        /* Tell 32-bit code it is being entered from an in-RAM copy */
-       movw    $GD_FLG_WARM_BOOT, %bx
+       movl    $GD_FLG_WARM_BOOT, %ebx
+
+       /*
+        * Zero the BIST (Built-In Self Test) value since we don't have it.
+        * It must be 0 or the previous loader would have reported an error.
+        */
+       movl    $0, %ebp
+
        jmp     1f
+
+       /* Add a way for tools to discover the _start entry point */
+       .align  4
+       .long   0x12345678
 _start:
        /*
-        * This is the 32-bit cold-reset entry point. Initialize %bx to 0
-        * in case we're preceeded by some sort of boot stub.
+        * This is the 32-bit cold-reset entry point, coming from start16.
+        * Set %ebx to GD_FLG_COLD_BOOT to indicate this.
         */
-       movw    $GD_FLG_COLD_BOOT, %bx
+       movl    $GD_FLG_COLD_BOOT, %ebx
+
+       /* Save BIST */
+       movl    %eax, %ebp
 1:
 
-       /* Load the segement registes to match the gdt loaded in start16.S */
+       /* Save table pointer */
+       movl    %ecx, %esi
+
+       /* Load the segement registers to match the GDT loaded in start16.S */
        movl    $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
        movw    %ax, %fs
        movw    %ax, %ds
@@ -77,53 +79,81 @@ _start:
        /* Clear the interrupt vectors */
        lidt    blank_idt_ptr
 
-       /* Early platform init (setup gpio, etc ) */
+       /*
+        * Critical early platform init - generally not used, we prefer init
+        * to happen later when we have a console, in case something goes
+        * wrong.
+        */
        jmp     early_board_init
 .globl early_board_init_ret
 early_board_init_ret:
+       post_code(POST_START)
 
        /* Initialise Cache-As-RAM */
        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. 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 with x86 global descriptor table
+        *      early malloc area
+        *      stack
+        * bottom-> CONFIG_SYS_CAR_ADDR
         */
+       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
+       /* Set up global data */
+       mov     %esp, %eax
+       call    board_init_f_mem
+       mov     %eax, %esp
 
-       /* Stack grows down from top of CAR */
-       movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE), %esp
-
-       /* Reserve space on stack for global data */
-       subl    $GENERATED_GBL_DATA_SIZE, %esp
-
-       /* Align global data to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* Setup first parameter to setup_gdt */
-       movl    %esp, %eax
-
-       /* Reserve space for global descriptor table */
-       subl    $X86_GDT_SIZE, %esp
-
-       /* Align temporary global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* Set second parameter to setup_gdt */
-       movl    %esp, %edx
-
-       /* gd->gd_addr = gd (Required to allow gd->xyz to work) */
-       movl    %eax, (%eax)
+       /*
+        * Debug UART is available here although it may not be plumbed out
+        * to pins depending on the board. To use it:
+        *
+        * call  debug_uart_init
+        * mov   $'a', %eax
+        * call  printch
+        */
 
-       /* Setup global descriptor table so gd->xyz works */
-       call    setup_gdt
+       /* Get address of global_data */
+       mov     %fs:0, %edx
+#ifdef CONFIG_HAVE_FSP
+       /* Store the HOB list if we have one */
+       test    %esi, %esi
+       jz      skip_hob
+       movl    %esi, GD_HOB_LIST(%edx)
+
+skip_hob:
+#else
+       /* Store table pointer */
+       movl    %esi, GD_TABLE(%edx)
+#endif
+       /* Store BIST */
+       movl    %ebp, GD_BIST(%edx)
 
        /* Set parameter to board_init_f() to boot flags */
+       post_code(POST_START_DONE)
        xorl    %eax, %eax
-       movw    %bx, %ax
 
-       /* Enter, U-boot! */
+       /* Enter, U-Boot! */
        call    board_init_f
 
        /* indicate (lack of) progress */
@@ -144,40 +174,15 @@ board_init_f_r_trampoline:
        /* Stack grows down from top of SDRAM */
        movl    %eax, %esp
 
-       /* Reserve space on stack for global data */
-       subl    $GENERATED_GBL_DATA_SIZE, %esp
-
-       /* Align global data to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* Setup first parameter to memcpy (and setup_gdt) */
-       movl    %esp, %eax
+       /* See if we need to disable CAR */
+.weak  car_uninit
+       movl    $car_uninit, %eax
+       cmpl    $0, %eax
+       jz      1f
 
-       /* Setup second parameter to memcpy */
-       fs movl 0, %edx
-
-       /* Set third parameter to memcpy */
-       movl    $GENERATED_GBL_DATA_SIZE, %ecx
-
-       /* Copy global data from CAR to SDRAM stack */
-       call    memcpy
-
-       /* Reserve space for global descriptor table */
-       subl    $X86_GDT_SIZE, %esp
-
-       /* Align global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* 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
-
-       /* Re-enter U-Boot by calling board_init_f_r */
+       call    car_uninit
+1:
+       /* Re-enter U-Boot by calling board_init_f_r() */
        call    board_init_f_r
 
 die:
@@ -191,9 +196,10 @@ blank_idt_ptr:
 
        .p2align        2       /* force 4-byte alignment */
 
+       /* Add a multiboot header so U-Boot can be loaded by GRUB2 */
 multiboot_header:
        /* magic */
-       .long   0x1BADB002
+       .long   0x1badb002
        /* flags */
        .long   (1 << 16)
        /* checksum */