Commit e05d723f authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Linus Torvalds

[PATCH] i386, apic: clean up the APIC code

The apic code is quite unstructured and missing a lot of comments.

- Restructure the code into helper functions, timer, setup/shutdown,
  interrupt and power management blocks.
- Fixup comments.
- Namespace fixups
- Inline helpers for version and is_integrated
- Combine the ack_bad_irq functions

No functional changes.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Cc: Zachary Amsden <zach@vmware.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Rohit Seth <rohitseth@google.com>
Cc: Andi Kleen <ak@suse.de>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d66bea57
This diff is collapsed.
...@@ -1588,7 +1588,7 @@ void /*__init*/ print_local_APIC(void * dummy) ...@@ -1588,7 +1588,7 @@ void /*__init*/ print_local_APIC(void * dummy)
v = apic_read(APIC_LVR); v = apic_read(APIC_LVR);
printk(KERN_INFO "... APIC VERSION: %08x\n", v); printk(KERN_INFO "... APIC VERSION: %08x\n", v);
ver = GET_APIC_VERSION(v); ver = GET_APIC_VERSION(v);
maxlvt = get_maxlvt(); maxlvt = lapic_get_maxlvt();
v = apic_read(APIC_TASKPRI); v = apic_read(APIC_TASKPRI);
printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK); printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
* io_apic.c.) * io_apic.c.)
*/ */
#include <asm/uaccess.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -21,19 +20,34 @@ ...@@ -21,19 +20,34 @@
#include <asm/idle.h> #include <asm/idle.h>
#include <asm/apic.h>
#include <asm/uaccess.h>
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp; DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
EXPORT_PER_CPU_SYMBOL(irq_stat); EXPORT_PER_CPU_SYMBOL(irq_stat);
#ifndef CONFIG_X86_LOCAL_APIC
/* /*
* 'what should we do if we get a hw irq event on an illegal vector'. * 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves. * each architecture has to answer this themselves.
*/ */
void ack_bad_irq(unsigned int irq) void ack_bad_irq(unsigned int irq)
{ {
printk("unexpected IRQ trap at vector %02x\n", irq); printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq);
}
#ifdef CONFIG_X86_LOCAL_APIC
/*
* Currently unexpected vectors happen only on SMP and APIC.
* We _must_ ack these because every local APIC has only N
* irq slots per priority level, and a 'hanging, unacked' IRQ
* holds up an irq slot - in excessive cases (when multiple
* unexpected vectors occur) that might lock up the APIC
* completely.
* But only ack when the APIC is enabled -AK
*/
if (cpu_has_apic)
ack_APIC_irq();
#endif #endif
}
#ifdef CONFIG_4KSTACKS #ifdef CONFIG_4KSTACKS
/* /*
......
...@@ -600,7 +600,7 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip) ...@@ -600,7 +600,7 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
/* /*
* Due to the Pentium erratum 3AP. * Due to the Pentium erratum 3AP.
*/ */
maxlvt = get_maxlvt(); maxlvt = lapic_get_maxlvt();
if (maxlvt > 3) { if (maxlvt > 3) {
apic_read_around(APIC_SPIV); apic_read_around(APIC_SPIV);
apic_write(APIC_ESR, 0); apic_write(APIC_ESR, 0);
...@@ -697,7 +697,7 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip) ...@@ -697,7 +697,7 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
*/ */
Dprintk("#startup loops: %d.\n", num_starts); Dprintk("#startup loops: %d.\n", num_starts);
maxlvt = get_maxlvt(); maxlvt = lapic_get_maxlvt();
for (j = 1; j <= num_starts; j++) { for (j = 1; j <= num_starts; j++) {
Dprintk("Sending STARTUP #%d.\n",j); Dprintk("Sending STARTUP #%d.\n",j);
......
...@@ -97,7 +97,7 @@ static inline void ack_APIC_irq(void) ...@@ -97,7 +97,7 @@ static inline void ack_APIC_irq(void)
extern void (*wait_timer_tick)(void); extern void (*wait_timer_tick)(void);
extern int get_maxlvt(void); extern int lapic_get_maxlvt(void);
extern void clear_local_APIC(void); extern void clear_local_APIC(void);
extern void connect_bsp_APIC (void); extern void connect_bsp_APIC (void);
extern void disconnect_bsp_APIC (int virt_wire_setup); extern void disconnect_bsp_APIC (int virt_wire_setup);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment