Skip to contentSkip to conversation

ICH7 SCI_EN quirk required for Macbook

PATCH In review Ryan Lortie 2 participants 2 messages Jun 11, 2006 ACPI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ICH7 SCI_EN quirk required for Macbook

Hello

I've been working on getting my Macbook to sleep and wake up properly lately. This email directly follows my earlier posting to the linux-acpi list on the same subject ::

http://marc.theaimsgroup.com/?l=linux-acpi&m=114957637501557&w=2

The problem is that on resume the SCI_EN bit of the hardware power management control register is not set. This causes an endless stream of unacknowledged IRQ9s. This causes the kernel to ignore IRQ9 and prevents ACPI from working.

Fixing the problem is as simple as re-enabling the SCI_EN bit early in the resume process (before IRQs are enabled).

To this end, I've written a patch that enables the SCI_EN bit soon after resume on machines that need it (I do it for all ICH7-based Intel Apple machines since an email from Frederic Riss tells me that he has similar problems with his Mac Mini and my hack fixed it for him too).

Cheers

-------

This patch enables the SCI_EN bit on return from sleep on Intel-based Apple machines with the ICH7 chipset (where for some reason this bit gets disabled by sleep). This is required to prevent an endless stream of unacknowledged IRQ9s.

---
 drivers/acpi/sleep/main.c |   31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
drivers/acpi/sleep/main.c +31 -0
diff -urp linux-2.6.17-rc6/drivers/acpi/sleep/main.c linux-2.6.17-rc6+/drivers/acpi/sleep/main.c
@@ -17,6 +17,7 @@
 #include <linux/suspend.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
+#include <linux/pci.h>
 #include "sleep.h"
 
 u8 sleep_states[ACPI_S_STATE_COUNT];
@@ -34,6 +35,7 @@ static u32 acpi_suspend_states[] = {
 };
 
 static int init_8259A_after_S1;
+static int ich7_sci_en_quirk_enabled;
 
 /**
  *	acpi_pm_prepare - Do preliminary suspend work.
@@ -92,6 +94,10 @@ static int acpi_pm_enter(suspend_state_t
 
 	case PM_SUSPEND_MEM:
 		do_suspend_lowlevel();
+
+		if (ich7_sci_en_quirk_enabled)
+			acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1,
+					  ACPI_MTX_DO_NOT_LOCK);
 		break;
 
 	case PM_SUSPEND_DISK:
@@ -183,12 +189,37 @@ static int __init init_ints_after_s1(str
 	return 0;
 }
 
+/*
+ * Apple Macbook comes back from sleep with the SCI_EN bit disabled
+ * causing a flood of unacknowledged IRQ9s.  We need to set SCI_EN
+ * as soon as we come back.
+ */
+static int __init init_ich7_sci_en_quirk(struct dmi_system_id *d)
+{
+	/* Ensure that we have an ICH7 (this is subdevice :1f.0) */
+	if (NULL == pci_find_device(PCI_VENDOR_ID_INTEL,
+				    PCI_DEVICE_ID_INTEL_ICH7_1, NULL))
+		return 0;
+
+	/* Intel-based Apple with ICH7 chipset.  Enable the quirk. */
+	printk(KERN_WARNING "%s detected (ICH7 SCI_EN quirk enabled)\n",
+	       d->ident);
+	ich7_sci_en_quirk_enabled = 1;
+
+	return 0;
+}
+
 static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
 	{
 	 .callback = init_ints_after_s1,
 	 .ident = "Toshiba Satellite 4030cdt",
 	 .matches = {DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),},
 	 },
+	{
+	 .callback = init_ich7_sci_en_quirk,
+	 .ident = "Intel Apple",
+	 .matches = {DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer"),},
+	 },
 	{},
 };
 
#1 lore raw
Quoted 6 lines · Ryan Lortie

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

iQG5AwUARIxaLJ96IjKvqm/2AQJcMA0eIQnj5Lm6YfYiHecouNsckBvBcZaCsYLd Arzkg/lMV7UpXwuMbcoXo5/GHDqvGorjRfqfibmg82/gL/syS2kcv3xyPqGXTSsk iyuxyP0qW442mbC8Dp1r9eps953D5--=-Yb3G0z+a1ZV00/YAUUh4--

Where's the patch? Hmm?