|
@@ -94,8 +94,6 @@ struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
|
|
/* # of MP IRQ source entries */
|
|
|
int mp_irq_entries;
|
|
|
|
|
|
-/* Number of legacy interrupts */
|
|
|
-static int nr_legacy_irqs __read_mostly = NR_IRQS_LEGACY;
|
|
|
/* GSI interrupts */
|
|
|
static int nr_irqs_gsi = NR_IRQS_LEGACY;
|
|
|
|
|
@@ -147,7 +145,6 @@ static struct irq_cfg irq_cfgx[NR_IRQS];
|
|
|
|
|
|
void __init io_apic_disable_legacy(void)
|
|
|
{
|
|
|
- nr_legacy_irqs = 0;
|
|
|
nr_irqs_gsi = 0;
|
|
|
}
|
|
|
|
|
@@ -164,13 +161,13 @@ int __init arch_early_irq_init(void)
|
|
|
node= cpu_to_node(boot_cpu_id);
|
|
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
- if (i < nr_legacy_irqs)
|
|
|
+ if (i < legacy_pic->nr_legacy_irqs)
|
|
|
cfg[i].vector = IRQ0_VECTOR + i;
|
|
|
desc = irq_to_desc(i);
|
|
|
desc->chip_data = &cfg[i];
|
|
|
zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node);
|
|
|
zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node);
|
|
|
- if (i < nr_legacy_irqs)
|
|
|
+ if (i < legacy_pic->nr_legacy_irqs)
|
|
|
cpumask_setall(cfg[i].domain);
|
|
|
}
|
|
|
|
|
@@ -850,7 +847,7 @@ static int __init find_isa_irq_apic(int irq, int type)
|
|
|
*/
|
|
|
static int EISA_ELCR(unsigned int irq)
|
|
|
{
|
|
|
- if (irq < nr_legacy_irqs) {
|
|
|
+ if (irq < legacy_pic->nr_legacy_irqs) {
|
|
|
unsigned int port = 0x4d0 + (irq >> 3);
|
|
|
return (inb(port) >> (irq & 7)) & 1;
|
|
|
}
|
|
@@ -1446,8 +1443,8 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq
|
|
|
}
|
|
|
|
|
|
ioapic_register_intr(irq, desc, trigger);
|
|
|
- if (irq < nr_legacy_irqs)
|
|
|
- disable_8259A_irq(irq);
|
|
|
+ if (irq < legacy_pic->nr_legacy_irqs)
|
|
|
+ legacy_pic->chip->mask(irq);
|
|
|
|
|
|
ioapic_write_entry(apic_id, pin, entry);
|
|
|
}
|
|
@@ -1810,7 +1807,7 @@ __apicdebuginit(void) print_PIC(void)
|
|
|
unsigned int v;
|
|
|
unsigned long flags;
|
|
|
|
|
|
- if (!nr_legacy_irqs)
|
|
|
+ if (!legacy_pic->nr_legacy_irqs)
|
|
|
return;
|
|
|
|
|
|
printk(KERN_DEBUG "\nprinting PIC contents\n");
|
|
@@ -1894,7 +1891,7 @@ void __init enable_IO_APIC(void)
|
|
|
nr_ioapic_registers[apic] = reg_01.bits.entries+1;
|
|
|
}
|
|
|
|
|
|
- if (!nr_legacy_irqs)
|
|
|
+ if (!legacy_pic->nr_legacy_irqs)
|
|
|
return;
|
|
|
|
|
|
for(apic = 0; apic < nr_ioapics; apic++) {
|
|
@@ -1951,7 +1948,7 @@ void disable_IO_APIC(void)
|
|
|
*/
|
|
|
clear_IO_APIC();
|
|
|
|
|
|
- if (!nr_legacy_irqs)
|
|
|
+ if (!legacy_pic->nr_legacy_irqs)
|
|
|
return;
|
|
|
|
|
|
/*
|
|
@@ -2184,9 +2181,9 @@ static unsigned int startup_ioapic_irq(unsigned int irq)
|
|
|
struct irq_cfg *cfg;
|
|
|
|
|
|
spin_lock_irqsave(&ioapic_lock, flags);
|
|
|
- if (irq < nr_legacy_irqs) {
|
|
|
- disable_8259A_irq(irq);
|
|
|
- if (i8259A_irq_pending(irq))
|
|
|
+ if (irq < legacy_pic->nr_legacy_irqs) {
|
|
|
+ legacy_pic->chip->mask(irq);
|
|
|
+ if (legacy_pic->irq_pending(irq))
|
|
|
was_pending = 1;
|
|
|
}
|
|
|
cfg = irq_cfg(irq);
|
|
@@ -2719,8 +2716,8 @@ static inline void init_IO_APIC_traps(void)
|
|
|
* so default to an old-fashioned 8259
|
|
|
* interrupt if we can..
|
|
|
*/
|
|
|
- if (irq < nr_legacy_irqs)
|
|
|
- make_8259A_irq(irq);
|
|
|
+ if (irq < legacy_pic->nr_legacy_irqs)
|
|
|
+ legacy_pic->make_irq(irq);
|
|
|
else
|
|
|
/* Strange. Oh, well.. */
|
|
|
desc->chip = &no_irq_chip;
|
|
@@ -2877,7 +2874,7 @@ static inline void __init check_timer(void)
|
|
|
/*
|
|
|
* get/set the timer IRQ vector:
|
|
|
*/
|
|
|
- disable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->mask(0);
|
|
|
assign_irq_vector(0, cfg, apic->target_cpus());
|
|
|
|
|
|
/*
|
|
@@ -2890,7 +2887,7 @@ static inline void __init check_timer(void)
|
|
|
* automatically.
|
|
|
*/
|
|
|
apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
|
|
- init_8259A(1);
|
|
|
+ legacy_pic->init(1);
|
|
|
#ifdef CONFIG_X86_32
|
|
|
{
|
|
|
unsigned int ver;
|
|
@@ -2949,7 +2946,7 @@ static inline void __init check_timer(void)
|
|
|
if (timer_irq_works()) {
|
|
|
if (nmi_watchdog == NMI_IO_APIC) {
|
|
|
setup_nmi();
|
|
|
- enable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->unmask(0);
|
|
|
}
|
|
|
if (disable_timer_pin_1 > 0)
|
|
|
clear_IO_APIC_pin(0, pin1);
|
|
@@ -2972,14 +2969,14 @@ static inline void __init check_timer(void)
|
|
|
*/
|
|
|
replace_pin_at_irq_node(cfg, node, apic1, pin1, apic2, pin2);
|
|
|
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
|
|
|
- enable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->unmask(0);
|
|
|
if (timer_irq_works()) {
|
|
|
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
|
|
|
timer_through_8259 = 1;
|
|
|
if (nmi_watchdog == NMI_IO_APIC) {
|
|
|
- disable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->mask(0);
|
|
|
setup_nmi();
|
|
|
- enable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->unmask(0);
|
|
|
}
|
|
|
goto out;
|
|
|
}
|
|
@@ -2987,7 +2984,7 @@ static inline void __init check_timer(void)
|
|
|
* Cleanup, just in case ...
|
|
|
*/
|
|
|
local_irq_disable();
|
|
|
- disable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->mask(0);
|
|
|
clear_IO_APIC_pin(apic2, pin2);
|
|
|
apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n");
|
|
|
}
|
|
@@ -3006,22 +3003,22 @@ static inline void __init check_timer(void)
|
|
|
|
|
|
lapic_register_intr(0, desc);
|
|
|
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
|
|
|
- enable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->unmask(0);
|
|
|
|
|
|
if (timer_irq_works()) {
|
|
|
apic_printk(APIC_QUIET, KERN_INFO "..... works.\n");
|
|
|
goto out;
|
|
|
}
|
|
|
local_irq_disable();
|
|
|
- disable_8259A_irq(0);
|
|
|
+ legacy_pic->chip->mask(0);
|
|
|
apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
|
|
|
apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n");
|
|
|
|
|
|
apic_printk(APIC_QUIET, KERN_INFO
|
|
|
"...trying to set up timer as ExtINT IRQ...\n");
|
|
|
|
|
|
- init_8259A(0);
|
|
|
- make_8259A_irq(0);
|
|
|
+ legacy_pic->init(0);
|
|
|
+ legacy_pic->make_irq(0);
|
|
|
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
|
|
|
|
|
unlock_ExtINT_logic();
|
|
@@ -3063,7 +3060,7 @@ void __init setup_IO_APIC(void)
|
|
|
/*
|
|
|
* calling enable_IO_APIC() is moved to setup_local_APIC for BP
|
|
|
*/
|
|
|
- io_apic_irqs = nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
|
|
|
+ io_apic_irqs = legacy_pic->nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
|
|
|
|
|
|
apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
|
|
|
/*
|
|
@@ -3074,7 +3071,7 @@ void __init setup_IO_APIC(void)
|
|
|
sync_Arb_IDs();
|
|
|
setup_IO_APIC_irqs();
|
|
|
init_IO_APIC_traps();
|
|
|
- if (nr_legacy_irqs)
|
|
|
+ if (legacy_pic->nr_legacy_irqs)
|
|
|
check_timer();
|
|
|
}
|
|
|
|
|
@@ -3875,7 +3872,7 @@ static int __io_apic_set_pci_routing(struct device *dev, int irq,
|
|
|
/*
|
|
|
* IRQs < 16 are already in the irq_2_pin[] map
|
|
|
*/
|
|
|
- if (irq >= nr_legacy_irqs) {
|
|
|
+ if (irq >= legacy_pic->nr_legacy_irqs) {
|
|
|
cfg = desc->chip_data;
|
|
|
if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) {
|
|
|
printk(KERN_INFO "can not add pin %d for irq %d\n",
|