Merge remote branch 'origin/x86/apic' into x86/mrst
authorH. Peter Anvin <hpa@zytor.com>
Tue, 23 Feb 2010 00:25:18 +0000 (16:25 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 23 Feb 2010 00:25:18 +0000 (16:25 -0800)
Conflicts:
arch/x86/kernel/apic/io_apic.c

1  2 
arch/x86/include/asm/i8259.h
arch/x86/include/asm/io_apic.h
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/apic/nmi.c
arch/x86/kernel/i8259.c
arch/x86/kernel/irqinit.c
arch/x86/kernel/smpboot.c
arch/x86/kernel/visws_quirks.c

@@@ -24,8 -24,13 +24,8 @@@ extern unsigned int cached_irq_mask
  #define SLAVE_ICW4_DEFAULT    0x01
  #define PIC_ICW4_AEOI         2
  
- extern spinlock_t i8259A_lock;
+ extern raw_spinlock_t i8259A_lock;
  
 -extern void init_8259A(int auto_eoi);
 -extern void enable_8259A_irq(unsigned int irq);
 -extern void disable_8259A_irq(unsigned int irq);
 -extern unsigned int startup_8259A_irq(unsigned int irq);
 -
  /* the PIC may need a careful delay on some platforms, hence specific calls */
  static inline unsigned char inb_pic(unsigned int port)
  {
Simple merge
Simple merge
@@@ -167,8 -166,14 +167,14 @@@ int __init arch_early_irq_init(void
                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 < legacy_pic->nr_legacy_irqs)
-                       cpumask_setall(cfg[i].domain);
+               /*
+                * For legacy IRQ's, start with assigning irq0 to irq15 to
+                * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0.
+                */
 -              if (i < nr_legacy_irqs) {
++              if (i < legacy_pic->nr_legacy_irqs) {
+                       cfg[i].vector = IRQ0_VECTOR + i;
+                       cpumask_set_cpu(0, cfg[i].domain);
+               }
        }
  
        return 0;
@@@ -2180,10 -2250,10 +2251,10 @@@ static unsigned int startup_ioapic_irq(
        unsigned long flags;
        struct irq_cfg *cfg;
  
-       spin_lock_irqsave(&ioapic_lock, flags);
+       raw_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);
Simple merge
   */
  
  static int i8259A_auto_eoi;
- DEFINE_SPINLOCK(i8259A_lock);
+ DEFINE_RAW_SPINLOCK(i8259A_lock);
  static void mask_and_ack_8259A(unsigned int);
 +static void mask_8259A(void);
 +static void unmask_8259A(void);
 +static void disable_8259A_irq(unsigned int irq);
 +static void enable_8259A_irq(unsigned int irq);
 +static void init_8259A(int auto_eoi);
 +static int i8259A_irq_pending(unsigned int irq);
  
  struct irq_chip i8259A_chip = {
        .name           = "XT-PIC",
@@@ -80,10 -74,10 +80,10 @@@ static void disable_8259A_irq(unsigned 
                outb(cached_slave_mask, PIC_SLAVE_IMR);
        else
                outb(cached_master_mask, PIC_MASTER_IMR);
-       spin_unlock_irqrestore(&i8259A_lock, flags);
+       raw_spin_unlock_irqrestore(&i8259A_lock, flags);
  }
  
 -void enable_8259A_irq(unsigned int irq)
 +static void enable_8259A_irq(unsigned int irq)
  {
        unsigned int mask = ~(1 << irq);
        unsigned long flags;
                outb(cached_slave_mask, PIC_SLAVE_IMR);
        else
                outb(cached_master_mask, PIC_MASTER_IMR);
-       spin_unlock_irqrestore(&i8259A_lock, flags);
+       raw_spin_unlock_irqrestore(&i8259A_lock, flags);
  }
  
 -int i8259A_irq_pending(unsigned int irq)
 +static int i8259A_irq_pending(unsigned int irq)
  {
        unsigned int mask = 1<<irq;
        unsigned long flags;
@@@ -296,10 -290,10 +296,10 @@@ static void mask_8259A(void
        outb(0xff, PIC_MASTER_IMR);     /* mask all of 8259A-1 */
        outb(0xff, PIC_SLAVE_IMR);      /* mask all of 8259A-2 */
  
-       spin_unlock_irqrestore(&i8259A_lock, flags);
+       raw_spin_unlock_irqrestore(&i8259A_lock, flags);
  }
  
 -void unmask_8259A(void)
 +static void unmask_8259A(void)
  {
        unsigned long flags;
  
        outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
        outb(cached_slave_mask, PIC_SLAVE_IMR);   /* restore slave IRQ mask */
  
-       spin_unlock_irqrestore(&i8259A_lock, flags);
+       raw_spin_unlock_irqrestore(&i8259A_lock, flags);
  }
  
 -void init_8259A(int auto_eoi)
 +static void init_8259A(int auto_eoi)
  {
        unsigned long flags;
  
        outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
        outb(cached_slave_mask, PIC_SLAVE_IMR);   /* restore slave IRQ mask */
  
-       spin_unlock_irqrestore(&i8259A_lock, flags);
+       raw_spin_unlock_irqrestore(&i8259A_lock, flags);
  }
 +
 +/*
 + * make i8259 a driver so that we can select pic functions at run time. the goal
 + * is to make x86 binary compatible among pc compatible and non-pc compatible
 + * platforms, such as x86 MID.
 + */
 +
 +static void __init legacy_pic_noop(void) { };
 +static void __init legacy_pic_uint_noop(unsigned int unused) { };
 +static void __init legacy_pic_int_noop(int unused) { };
 +
 +static struct irq_chip dummy_pic_chip  = {
 +      .name = "dummy pic",
 +      .mask = legacy_pic_uint_noop,
 +      .unmask = legacy_pic_uint_noop,
 +      .disable = legacy_pic_uint_noop,
 +      .mask_ack = legacy_pic_uint_noop,
 +};
 +static int legacy_pic_irq_pending_noop(unsigned int irq)
 +{
 +      return 0;
 +}
 +
 +struct legacy_pic null_legacy_pic = {
 +      .nr_legacy_irqs = 0,
 +      .chip = &dummy_pic_chip,
 +      .mask_all = legacy_pic_noop,
 +      .restore_mask = legacy_pic_noop,
 +      .init = legacy_pic_int_noop,
 +      .irq_pending = legacy_pic_irq_pending_noop,
 +      .make_irq = legacy_pic_uint_noop,
 +};
 +
 +struct legacy_pic default_legacy_pic = {
 +      .nr_legacy_irqs = NR_IRQS_LEGACY,
 +      .chip  = &i8259A_chip,
 +      .mask_all  = mask_8259A,
 +      .restore_mask = unmask_8259A,
 +      .init = init_8259A,
 +      .irq_pending = i8259A_irq_pending,
 +      .make_irq = make_8259A_irq,
 +};
 +
 +struct legacy_pic *legacy_pic = &default_legacy_pic;
Simple merge
Simple merge
Simple merge