]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: fsp: Reinit the FPU after FSP meminit
authorSimon Glass <sjg@chromium.org>
Fri, 3 Jul 2020 03:12:12 +0000 (21:12 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Thu, 9 Jul 2020 04:33:24 +0000 (12:33 +0800)
The APL FSP appears to leave the FPU in a bad state in that it has
registers in use. This causes an error when the next FPU operation is
performed.

Work around this by re-resetting the FPU after calling FSP-M. This allows
the freetype console to work correctly.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/i386/cpu.c
arch/x86/include/asm/u-boot-x86.h
arch/x86/lib/fsp2/fsp_meminit.c

index 435e50edada7d368613c00a92442bb36a63c534b..d27324cb4e2ed67f04aeb7dd46e8c04b1fd4ddf3 100644 (file)
@@ -363,6 +363,11 @@ static void setup_cpu_features(void)
        : : "i" (em_rst), "i" (mp_ne_set) : "eax");
 }
 
+void cpu_reinit_fpu(void)
+{
+       asm ("fninit\n");
+}
+
 static void setup_identity(void)
 {
        /* identify CPU via cpuid and store the decoded info into gd->arch */
index 3e5d56d0757d53748d84a87c158a024afcf2c64b..bd3f44014c543b62f14e20ff50862b7254e47bb4 100644 (file)
@@ -43,6 +43,14 @@ int x86_cpu_reinit_f(void);
  */
 int x86_cpu_init_tpl(void);
 
+/**
+ * cpu_reinit_fpu() - Reinit the FPU if something is wrong with it
+ *
+ * The FSP-M code can leave registers in use in the FPU. This functions reinits
+ * it so that the FPU can be used safely
+ */
+void cpu_reinit_fpu(void);
+
 int cpu_init_f(void);
 void setup_gdt(struct global_data *id, u64 *gdt_addr);
 /*
index 1a758147b08623b5ed2109c978fd588437a72080..faf9c29aef7a35df5eaeb6fabbb1108f4c3b35ba 100644 (file)
@@ -85,6 +85,7 @@ int fsp_memory_init(bool s3wake, bool use_spi_flash)
        func = (fsp_memory_init_func)(hdr->img_base + hdr->fsp_mem_init);
        ret = func(&upd, &hob);
        bootstage_accum(BOOTSTAGE_ID_ACCUM_FSP_M);
+       cpu_reinit_fpu();
        if (ret)
                return log_msg_ret("SDRAM init fail\n", ret);