[PATCH 2/6] x86: Ensure the CPU identity exists for timer init

Simon Glass sjg at chromium.org
Wed Aug 28 03:44:25 CEST 2024


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 at chromium.org>
---

 arch/x86/cpu/i386/cpu.c           | 5 +++++
 arch/x86/cpu/x86_64/cpu.c         | 6 ++++++
 arch/x86/include/asm/u-boot-x86.h | 9 +++++++++
 drivers/timer/tsc_timer.c         | 4 ++++
 4 files changed, 24 insertions(+)

diff --git a/arch/x86/cpu/i386/cpu.c b/arch/x86/cpu/i386/cpu.c
index 101837b3190..3726f7ff78f 100644
--- a/arch/x86/cpu/i386/cpu.c
+++ b/arch/x86/cpu/i386/cpu.c
@@ -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;
diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
index 80eab710315..71bc07f872a 100644
--- a/arch/x86/cpu/x86_64/cpu.c
+++ b/arch/x86/cpu/x86_64/cpu.c
@@ -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;
+}
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 5cc8f63334e..64139ead190 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -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
  *
diff --git a/drivers/timer/tsc_timer.c b/drivers/timer/tsc_timer.c
index 80c084f380d..d11227cf440 100644
--- a/drivers/timer/tsc_timer.c
+++ b/drivers/timer/tsc_timer.c
@@ -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
-- 
2.34.1



More information about the U-Boot mailing list