Merge branch 'linus' into x86/quirks
authorIngo Molnar <mingo@elte.hu>
Sun, 12 Oct 2008 10:43:21 +0000 (12:43 +0200)
committerIngo Molnar <mingo@elte.hu>
Sun, 12 Oct 2008 10:43:21 +0000 (12:43 +0200)
Conflicts:
arch/x86/kernel/early-quirks.c

1  2 
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/early-quirks.c

Simple merge
index 6b839b1476441c602f32ca62ad1a87a3bc801e87,24bb5faf5efaefedcb578d4f4f27415a015833c7..733c4f8d42ea587437191881974c786bc6e9186e
@@@ -95,52 -95,20 +95,66 @@@ static void __init nvidia_bugs(int num
  
  }
  
 +static u32 ati_ixp4x0_rev(int num, int slot, int func)
 +{
 +      u32 d;
 +      u8  b;
 +
 +      b = read_pci_config_byte(num, slot, func, 0xac);
 +      b &= ~(1<<5);
 +      write_pci_config_byte(num, slot, func, 0xac, b);
 +
 +      d = read_pci_config(num, slot, func, 0x70);
 +      d |= 1<<8;
 +      write_pci_config(num, slot, func, 0x70, d);
 +
 +      d = read_pci_config(num, slot, func, 0x8);
 +      d &= 0xff;
 +      return d;
 +}
 +
 +static void __init ati_bugs(int num, int slot, int func)
 +{
 +#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC)
 +      u32 d;
 +      u8  b;
 +
 +      if (acpi_use_timer_override)
 +              return;
 +
 +      d = ati_ixp4x0_rev(num, slot, func);
 +      if (d  < 0x82)
 +              acpi_skip_timer_override = 1;
 +      else {
 +              /* check for IRQ0 interrupt swap */
 +              outb(0x72, 0xcd6); b = inb(0xcd7);
 +              if (!(b & 0x2))
 +                      acpi_skip_timer_override = 1;
 +      }
 +
 +      if (acpi_skip_timer_override) {
 +              printk(KERN_INFO "SB4X0 revision 0x%x\n", d);
 +              printk(KERN_INFO "Ignoring ACPI timer override.\n");
 +              printk(KERN_INFO "If you got timer trouble "
 +                     "try acpi_use_timer_override\n");
 +      }
 +#endif
 +}
 +
+ #ifdef CONFIG_DMAR
+ static void __init intel_g33_dmar(int num, int slot, int func)
+ {
+       struct acpi_table_header *dmar_tbl;
+       acpi_status status;
+       status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl);
+       if (ACPI_SUCCESS(status)) {
+               printk(KERN_INFO "BIOS BUG: DMAR advertised on Intel G31/G33 chipset -- ignoring\n");
+               dmar_disabled = 1;
+       }
+ }
+ #endif
  #define QFLAG_APPLY_ONCE      0x1
  #define QFLAG_APPLIED         0x2
  #define QFLAG_DONE            (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
@@@ -160,8 -128,10 +174,12 @@@ static struct chipset early_qrk[] __ini
          PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
        { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
          PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
 +      { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
 +        PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
+ #ifdef CONFIG_DMAR
+       { PCI_VENDOR_ID_INTEL, 0x29c0,
+         PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar },
+ #endif
        {}
  };