diff options
author | Rafał Bilski <rafalbilski@interia.pl> | 2006-07-04 11:50:57 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2006-07-31 18:37:05 -0400 |
commit | 48b7bde0f6d5fd08d046b583cfa0118ad74c6caf (patch) | |
tree | 67473b4acac35e23c6acfa17e7e5e4de3b626d15 | |
parent | dadb49d8746bc4a4b5a310dabf0c838e57a9b531 (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.c | 12 |
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); |