aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Bilski <rafalbilski@interia.pl>2006-07-04 11:50:57 -0400
committerDave Jones <davej@redhat.com>2006-07-31 18:37:05 -0400
commit48b7bde0f6d5fd08d046b583cfa0118ad74c6caf (patch)
tree67473b4acac35e23c6acfa17e7e5e4de3b626d15
parentdadb49d8746bc4a4b5a310dabf0c838e57a9b531 (diff)
[CPUFREQ] Longhaul - Workaround issues with APIC.
There is no need to worry about local APIC. There is need to worry about I/O APIC, because I/O APIC is replacing good old 8259. According to Nehemiah datasheet VIA is using 3-wire bus to connect local APIC to I/O APIC. "[...] When IA32_APIC_BASE[11] is set to 0, processor APICs based on the 3-wire APIC bus cannot be generally re-enabled until a system hardware reset. The 3-wire bus looses track of arbitration that would be necessary for complete re-enabling. Certain (local) APIC functionality can be enabled. [...]" So we must set disable bit for each interrupt in I/O APIC registers. Same situation as for PIC - we must poke registers direcly. How to do this? I don't know. So at the moment it is better to fail. Signed-off-by: Rafał Bilski <rafalbilski@interia.pl> Signed-off-by: Dave Jones <davej@redhat.com>
-rw-r--r--arch/i386/kernel/cpu/cpufreq/longhaul.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c
index d735cb460612..dfd243f497b2 100644
--- a/arch/i386/kernel/cpu/cpufreq/longhaul.c
+++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c
@@ -688,6 +688,18 @@ static int __init longhaul_init(void)
688 if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6) 688 if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6)
689 return -ENODEV; 689 return -ENODEV;
690 690
691#ifdef CONFIG_SMP
692 if (num_online_cpus() > 1) {
693 return -ENODEV;
694 printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n");
695 }
696#endif
697#ifdef CONFIG_X86_IO_APIC
698 if (cpu_has_apic) {
699 printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n");
700 return -ENODEV;
701 }
702#endif
691 switch (c->x86_model) { 703 switch (c->x86_model) {
692 case 6 ... 9: 704 case 6 ... 9:
693 return cpufreq_register_driver(&longhaul_driver); 705 return cpufreq_register_driver(&longhaul_driver);