From: Krzysztof Helt <krzysztof.h1@wp.pl>
cpus without the CPUID instruction are identified
as general 386 or 486 while some cpus (mostly made
by Cyrix) provide c_identify function which identify
correctly older cpus using cpu specific registers).
Cyrix cpus are even worse as 5x86 and 6x68 have
the CPUID instruction disabled. The CPUID is
enabled by the c_identify() but the c_identify
is only called when the CPUID is available.
Fix this by calling the c_identify() for all known
cpu families if there is no the CPUID instruction
Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
---
I have tested it on Cyrix Cx486DX2 cpu.
I suspect that coma_bug field and mtrr support is not
set correctly for the Cyrix 6x86 family. I have not a cpu from
the Cyrix 6x68 family to test.
The code path is (+ where the patch code is added)
if (have_cpuid_p()) {
}
+ } else {
...
+ }
so it does not affect cpus with the CPUID instruction.
Regards,
Krzysztof
diff -urp linux-mm/arch/x86/kernel/cpu/common.c linux-486/arch/x86/kernel/cpu/common.c
--- linux-mm/arch/x86/kernel/cpu/common.c 2008-09-05 23:38:20.295563396 +0200
+++ linux-486/arch/x86/kernel/cpu/common.c 2008-09-12 22:53:27.062265329 +0200
@@ -444,6 +444,17 @@ static void __cpuinit generic_identify(s
init_scattered_cpuid_features(c);
detect_nopl(c);
+ } else {
+ int i;
+ for (i = 0; i < X86_VENDOR_NUM; i++)
+ if (cpu_devs[i] && cpu_devs[i]->c_identify) {
+ c->x86_vendor_id[0] = 0;
+ cpu_devs[i]->c_identify(c);
+ if (c->x86_vendor_id[0]) {
+ get_cpu_vendor(c, 0);
+ break;
+ }
+ }
}
}
--
1. can you check tip/master? 2. please check if you can add code in early_identify_cpu 3. need to move c_identify_cpu calling to identify_cpu YH --
I updated it to tip/master and call that in early_identify_cpu. it should solve mtrr detection for Cyrix ... Please check attached patch. Thanks YH
On Sat, 13 Sep 2008 22:55:10 -0700 As I wrote I have no CPU to test this (Cyrix with ARRs). Finally, I am going to buy one or two of them during next two weeks so I will test. I would like to postpone your patch until I (or someone else) test it. There is some misunderstanding about the patch. There are two issues here. The early enabling of mtrr registers and nicer and more accurate /proc/cpuinfo content (and the CPU's name during boot). My patch was only about the latter. It was not about the early identification or solving the mtrr problem (as without testing I am not sure I can correctly do this). Your patch resets the /proc/cpuinfo One wants to call c_early_init() here for Cyrix cpus- otherwise the mtrr caps are not set. The correct patch here is only: - - if (!have_cpuid_p()) - return; - cpu_detect(c); + if (!have_cpuid_p()) + enable_cpuid_on_some_cpus(); /* pseudo code for now */ + if (have_cpuid_p()) + cpu_detect(c); I have just checked: http://git.kernel.org/?p=linux/kernel/git/x86/linux-2.6-tip.git The identify_cpu can stay the way it was. No changes here needed. My patch improves the /proc/cpuinfo content. The next patch should only enable the cpuid instruction on cyrix. Regards, Krzysztof --
could change to
if (!have_cpuid_p()) {
identify_cpu_without_cpuid(c);
if (!have_cpuid_p())
return;
cpu_detect(c);
get_cpu_vendor(c);
get_cpu_cap(c);
if (this_cpu->c_early_init)
this_cpu->c_early_init(c);
tip/master is changed a lot to mainline.
YH
--
