]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: Ensure the CPU identity exists for timer init
authorSimon Glass <sjg@chromium.org>
Wed, 28 Aug 2024 01:44:25 +0000 (19:44 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 18 Oct 2024 20:10:21 +0000 (14:10 -0600)
When bootstage is used the timer can be inited before the CPU identity
is set up, resulting in the checks for the vendor not working.

Add a special call to work around this.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/i386/cpu.c
arch/x86/cpu/x86_64/cpu.c
arch/x86/include/asm/u-boot-x86.h
drivers/timer/tsc_timer.c

index 532f690c8748f9647f42c3d69aa3e96fca728b4d..a51a24498a7f4c96c93f9e922eb64c8c7810e822 100644 (file)
@@ -501,6 +501,11 @@ int x86_cpu_reinit_f(void)
        return 0;
 }
 
+void x86_get_identity_for_timer(void)
+{
+       setup_identity();
+}
+
 void x86_enable_caches(void)
 {
        unsigned long cr0;
index 80eab71031529e3db98855df8042957b48fdcfd8..71bc07f872ad6bebbc7fe6cc323f4dc119adb44f 100644 (file)
@@ -75,3 +75,9 @@ void board_debug_uart_init(void)
        /* this was already done in SPL */
 }
 #endif
+
+void x86_get_identity_for_timer(void)
+{
+       /* set the vendor to Intel so that native_calibrate_tsc() works */
+       gd->arch.x86_vendor = X86_VENDOR_INTEL;
+}
index 5cc8f63334ef225195c44fa7755fff007a8277f7..64139ead190c66512290a8f099625e3e8c6e038a 100644 (file)
@@ -43,6 +43,15 @@ int x86_cpu_reinit_f(void);
  */
 int x86_cpu_init_tpl(void);
 
+/**
+ * x86_get_identity_for_timer() - Set up CPU identity for use by the early timer
+ *
+ * The timer can be needed early in board_f if bootstage is enabled. This
+ * function can be called from the TSC timer to make sure that the CPU-identity
+ * info has been set up
+ */
+void x86_get_identity_for_timer(void);
+
 /**
  * cpu_reinit_fpu() - Reinit the FPU if something is wrong with it
  *
index 80c084f380d9ea01680e91c75ca4ae9bbc18c76e..d11227cf440d3ecc9e798799106eed1b88604be1 100644 (file)
@@ -403,6 +403,10 @@ static void tsc_timer_ensure_setup(bool early)
        if (!gd->arch.clock_rate) {
                unsigned long fast_calibrate;
 
+               /* deal with this being called before x86_cpu_init_f() */
+               if (!gd->arch.x86_vendor)
+                       x86_get_identity_for_timer();
+
                /**
                 * There is no obvious way to obtain this information from EFI
                 * boot services. This value was measured on a Framework Laptop