x86: Save the BIST value on reset
authorSimon Glass <sjg@chromium.org>
Thu, 6 Nov 2014 20:20:10 +0000 (13:20 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 21 Nov 2014 06:24:10 +0000 (07:24 +0100)
The built in self test value is available in register eax on start-up. Save
it so that it can be accessed later. Unfortunately we must wait until the
global_data is available before we can do this, so there is a little bit of
shuffling to keep it around.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/start.S
arch/x86/cpu/start16.S
arch/x86/include/asm/global_data.h
lib/asm-offsets.c

index 781d32447ba6c53a5fe50cc341b88c36f0be870d..b18f3201bc18ccec9d08e47fad6786053910e864 100644 (file)
@@ -49,6 +49,8 @@ _start:
         */
        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
@@ -117,9 +119,10 @@ car_init_ret:
        addl    $GD_MALLOC_BASE, %edx
        movl    %esp, (%edx)
 #endif
-
-       /* Align temporary global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
+       /* Store BIST */
+       movl    %eax, %edx
+       addl    $GD_BIST, %edx
+       movl    %ebp, (%edx)
 
        /* Set second parameter to setup_gdt */
        movl    %ecx, %edx
index 445d5a17345585b1cf467b9d80c649bf95f6e68e..9550502e9ae8f58e79f24929945058a006924d4a 100644 (file)
@@ -21,6 +21,9 @@
 .code16
 .globl start16
 start16:
+       /* Save BIST */
+       movl    %eax, %ecx
+
        /* Set the Cold Boot / Hard Reset flag */
        movl    $GD_FLG_COLD_BOOT, %ebx
 
@@ -45,9 +48,11 @@ o32 cs       lgdt    gdt_ptr
        /* Flush the prefetch queue */
        jmp     ff
 ff:
-       /* Finally jump to the 32bit initialization code */
+
+       /* Finally restore BIST and jump to the 32bit initialization code */
        movw    $code32start, %ax
        movw    %ax, %bp
+       movl    %ecx, %eax
 o32 cs ljmp    *(%bp)
 
        /* 48-bit far pointer */
index 3e8e2cdb9ebdd65f304848678f7038250db72c8d..9eae2286770eb7bc8a56053d55e1137ffa64d1c6 100644 (file)
@@ -17,6 +17,7 @@ struct arch_global_data {
        uint32_t tsc_base_kclocks;      /* Initial tsc as a kclocks value */
        uint32_t tsc_prev;              /* For show_boot_progress() */
        void *new_fdt;                  /* Relocated FDT */
+       uint32_t bist;                  /* Built-in self test value */
 };
 
 #endif
index 129bc3e2aff7eb18d80a4a10afe9cb5688f33384..580f763da67bfcc396bdbe7beb10de0e9939d3bf 100644 (file)
@@ -31,6 +31,9 @@ int main(void)
 #ifdef CONFIG_SYS_MALLOC_F_LEN
        DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
 #endif
+#ifdef CONFIG_X86
+       DEFINE(GD_BIST, offsetof(struct global_data, arch.bist));
+#endif
 
 #if defined(CONFIG_ARM)