|
@@ -449,7 +449,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12,
|
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, quirk_ich4_lpc_acpi);
|
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, quirk_ich4_lpc_acpi);
|
|
|
|
|
|
-static void __devinit quirk_ich6_lpc_acpi(struct pci_dev *dev)
|
|
|
+static void __devinit ich6_lpc_acpi_gpio(struct pci_dev *dev)
|
|
|
{
|
|
|
u32 region;
|
|
|
|
|
@@ -459,20 +459,95 @@ static void __devinit quirk_ich6_lpc_acpi(struct pci_dev *dev)
|
|
|
pci_read_config_dword(dev, 0x48, ®ion);
|
|
|
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH6 GPIO");
|
|
|
}
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_1, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_2, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_4, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, quirk_ich6_lpc_acpi);
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_8, quirk_ich6_lpc_acpi);
|
|
|
+
|
|
|
+static void __devinit ich6_lpc_generic_decode(struct pci_dev *dev, unsigned reg, const char *name, int dynsize)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+ u32 size, base;
|
|
|
+
|
|
|
+ pci_read_config_dword(dev, reg, &val);
|
|
|
+
|
|
|
+ /* Enabled? */
|
|
|
+ if (!(val & 1))
|
|
|
+ return;
|
|
|
+ base = val & 0xfffc;
|
|
|
+ if (dynsize) {
|
|
|
+ /*
|
|
|
+ * This is not correct. It is 16, 32 or 64 bytes depending on
|
|
|
+ * register D31:F0:ADh bits 5:4.
|
|
|
+ *
|
|
|
+ * But this gets us at least _part_ of it.
|
|
|
+ */
|
|
|
+ size = 16;
|
|
|
+ } else {
|
|
|
+ size = 128;
|
|
|
+ }
|
|
|
+ base &= ~(size-1);
|
|
|
+
|
|
|
+ /* Just print it out for now. We should reserve it after more debugging */
|
|
|
+ dev_info(&dev->dev, "%s PIO at %04x-%04x\n", name, base, base+size-1);
|
|
|
+}
|
|
|
+
|
|
|
+static void __devinit quirk_ich6_lpc(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ /* Shared ACPI/GPIO decode with all ICH6+ */
|
|
|
+ ich6_lpc_acpi_gpio(dev);
|
|
|
+
|
|
|
+ /* ICH6-specific generic IO decode */
|
|
|
+ ich6_lpc_generic_decode(dev, 0x84, "LPC Generic IO decode 1", 0);
|
|
|
+ ich6_lpc_generic_decode(dev, 0x88, "LPC Generic IO decode 2", 1);
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc);
|
|
|
+
|
|
|
+static void __devinit ich7_lpc_generic_decode(struct pci_dev *dev, unsigned reg, const char *name)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+ u32 mask, base;
|
|
|
+
|
|
|
+ pci_read_config_dword(dev, reg, &val);
|
|
|
+
|
|
|
+ /* Enabled? */
|
|
|
+ if (!(val & 1))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * IO base in bits 15:2, mask in bits 23:18, both
|
|
|
+ * are dword-based
|
|
|
+ */
|
|
|
+ base = val & 0xfffc;
|
|
|
+ mask = (val >> 16) & 0xfc;
|
|
|
+ mask |= 3;
|
|
|
+
|
|
|
+ /* Just print it out for now. We should reserve it after more debugging */
|
|
|
+ dev_info(&dev->dev, "%s PIO at %04x (mask %04x)\n", name, base, mask);
|
|
|
+}
|
|
|
+
|
|
|
+/* ICH7-10 has the same common LPC generic IO decode registers */
|
|
|
+static void __devinit quirk_ich7_lpc(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ /* We share the common ACPI/DPIO decode with ICH6 */
|
|
|
+ ich6_lpc_acpi_gpio(dev);
|
|
|
+
|
|
|
+ /* And have 4 ICH7+ generic decodes */
|
|
|
+ ich7_lpc_generic_decode(dev, 0x84, "ICH7 LPC Generic IO decode 1");
|
|
|
+ ich7_lpc_generic_decode(dev, 0x88, "ICH7 LPC Generic IO decode 2");
|
|
|
+ ich7_lpc_generic_decode(dev, 0x8c, "ICH7 LPC Generic IO decode 3");
|
|
|
+ ich7_lpc_generic_decode(dev, 0x90, "ICH7 LPC Generic IO decode 4");
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_1, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_2, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_4, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_8, quirk_ich7_lpc);
|
|
|
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_1, quirk_ich7_lpc);
|
|
|
|
|
|
/*
|
|
|
* VIA ACPI: One IO region pointed to by longword at
|