From 95e5e682f1a4cf716c89c9f9e6c01da898fb1f9c Mon Sep 17 00:00:00 2001 From: Andi Kleen <ak@suse.de> Date: Thu, 20 Jan 2005 16:00:00 -0800 Subject: [PATCH] [PATCH] x86-64: Clean up cpuid level detection Small cleanup: save the CPUID level once instead of regetting it all the time. Needed for some other patches. Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org> --- arch/x86_64/kernel/setup.c | 11 +++++++---- include/asm-x86_64/processor.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 17a6a8cf777a..473fa9f7c2ad 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c @@ -637,7 +637,7 @@ static int __init get_model_name(struct cpuinfo_x86 *c) { unsigned int *v; - if (cpuid_eax(0x80000000) < 0x80000004) + if (c->x86_cpuid_level < 0x80000004) return 0; v = (unsigned int *) c->x86_model_id; @@ -653,7 +653,7 @@ static void __init display_cacheinfo(struct cpuinfo_x86 *c) { unsigned int n, dummy, eax, ebx, ecx, edx; - n = cpuid_eax(0x80000000); + n = c->x86_cpuid_level; if (n >= 0x80000005) { cpuid(0x80000005, &dummy, &ebx, &ecx, &edx); @@ -713,7 +713,7 @@ static int __init init_amd(struct cpuinfo_x86 *c) } display_cacheinfo(c); - if (cpuid_eax(0x80000000) >= 0x80000008) { + if (c->x86_cpuid_level >= 0x80000008) { c->x86_num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; if (c->x86_num_cores & (c->x86_num_cores - 1)) c->x86_num_cores = 1; @@ -804,7 +804,7 @@ static void __init init_intel(struct cpuinfo_x86 *c) unsigned n; init_intel_cacheinfo(c); - n = cpuid_eax(0x80000000); + n = c->x86_cpuid_level; if (n >= 0x80000008) { unsigned eax = cpuid_eax(0x80000008); c->x86_virt_bits = (eax >> 8) & 0xff; @@ -850,6 +850,7 @@ void __init early_identify_cpu(struct cpuinfo_x86 *c) c->x86_cache_alignment = c->x86_clflush_size; c->x86_num_cores = 1; c->x86_apicid = c == &boot_cpu_data ? 0 : c - cpu_data; + c->x86_cpuid_level = 0; memset(&c->x86_capability, 0, sizeof c->x86_capability); /* Get vendor name */ @@ -896,6 +897,7 @@ void __init identify_cpu(struct cpuinfo_x86 *c) /* AMD-defined flags: level 0x80000001 */ xlvl = cpuid_eax(0x80000000); + c->x86_cpuid_level = xlvl; if ((xlvl & 0xffff0000) == 0x80000000) { if (xlvl >= 0x80000001) { c->x86_capability[1] = cpuid_edx(0x80000001); @@ -908,6 +910,7 @@ void __init identify_cpu(struct cpuinfo_x86 *c) /* Transmeta-defined flags: level 0x80860001 */ xlvl = cpuid_eax(0x80860000); if ((xlvl & 0xffff0000) == 0x80860000) { + /* Don't set x86_cpuid_level here for now to not confuse. */ if (xlvl >= 0x80860001) c->x86_capability[2] = cpuid_edx(0x80860001); } diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h index 373b8207a014..dd040e5b4119 100644 --- a/include/asm-x86_64/processor.h +++ b/include/asm-x86_64/processor.h @@ -64,6 +64,7 @@ struct cpuinfo_x86 { __u8 x86_num_cores; __u8 x86_apicid; __u32 x86_power; + __u32 x86_cpuid_level; /* Max CPUID function supported */ unsigned long loops_per_jiffy; } ____cacheline_aligned; -- 2.30.9