When U-Boot is configured as a coreboot payload on x86_64, the current
code leaves the CPU identity at the default Intel vendor and device ID
0x0, even on non-Intel platforms.

Read CPUID leaf 0 and build the 12-byte vendor string from EBX:EDX:ECX
to identify the CPU vendor at runtime. Set gd->arch.x86_vendor to Intel/AMD
when matched, with fallback to X86_VENDOR_ANY for unknown vendors. Also
stores cpuid_eax(1) in gd->arch.x86_device so later x86 code can use the
detected CPU indentity.

This avoids relying on a fixed vendor value and keeps vendor-sensitive
paths(e.g. TSC calibration) aligned with the actual CPU.

Signed-off-by: Desapogu Jayaramudu <[email protected]>
---
 arch/x86/cpu/x86_64/cpu.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
index 25ae92c702fbca..3ccd0fb45ba6f5 100644
--- a/arch/x86/cpu/x86_64/cpu.c
+++ b/arch/x86/cpu/x86_64/cpu.c
@@ -50,8 +50,21 @@ static void setup_sse_features(void)
 
 int x86_cpu_reinit_f(void)
 {
-       /* set the vendor to Intel so that native_calibrate_tsc() works */
-       gd->arch.x86_vendor = X86_VENDOR_INTEL;
+       struct cpuid_result res;
+       char vendor[13];
+
+       res = cpuid(0x00000000);
+       memcpy(&vendor[0], &res.ebx, 4);
+       memcpy(&vendor[4], &res.edx, 4);
+       memcpy(&vendor[8], &res.ecx, 4);
+       vendor[12] = '\0';
+       if (!strcmp(vendor, "GenuinIntel"))
+               gd->arch.x86_vendor = X86_VENDOR_INTEL; /* 
native_calibrate_tsc() works*/
+       else if (!strcmp(vendor, "AuthenticAMD"))
+               gd->arch.x86_vendor = X86_VENDOR_AMD;
+       else
+               gd->arch.x86_vendor = X86_VENDOR_ANY;
+       gd->arch.x86_device = cpuid_eax(1);
        gd->arch.has_mtrr = true;
        if (IS_ENABLED(CONFIG_X86_HARDFP))
                setup_sse_features();
-- 
2.43.0

Reply via email to