[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#270426: Bugzilla Bug 3532 ACPI poweroff stopped working (Dell Inspiron 8600)



>On Sat, Oct 09, 2004 at 10:56:54AM +0200, Toralf Förster wrote:
>> 
>> http://bugs.gentoo.org/show_bug.cgi?id=66613
>> 
>> http://bugzilla.kernel.org/show_bug.cgi?id=3532
>
>Could you please supply a copy of the 2705_fix-intel-acpi.patch
>in question?
>
>-- 
>Horms
attched is the file
Fix ACPI for Intel chipsets
From http://bugzilla.kernel.org/show_bug.cgi?id=2941
Already in 2.6.9-rc
See http://bugs.gentoo.org/show_bug.cgi?id=60565

diff -urNp linux-2.6.8-gentoo-r3/arch/i386/kernel/dmi_scan.c linux-dsd/arch/i386/kernel/dmi_scan.c
--- linux-2.6.8-gentoo-r3/arch/i386/kernel/dmi_scan.c	2004-09-05 11:21:41.000000000 +0100
+++ linux-dsd/arch/i386/kernel/dmi_scan.c	2004-09-06 14:14:47.687555192 +0100
@@ -163,27 +163,6 @@ static void __init dmi_save_ident(struct
 #define MATCH		DMI_MATCH
 
 /*
- * Some machines, usually laptops, can't handle an enabled local APIC.
- * The symptoms include hangs or reboots when suspending or resuming,
- * attaching or detaching the power cord, or entering BIOS setup screens
- * through magic key sequences.
- */
-static int __init local_apic_kills_bios(struct dmi_blacklist *d)
-{
-#ifdef CONFIG_X86_LOCAL_APIC
-	extern int enable_local_apic;
-	if (enable_local_apic == 0) {
-		enable_local_apic = -1;
-		printk(KERN_WARNING "%s with broken BIOS detected. "
-		       "Refusing to enable the local APIC.\n",
-		       d->ident);
-	}
-#endif
-	return 0;
-}
-
-
-/*
  * Toshiba keyboard likes to repeat keys when they are not repeated.
  */
 
@@ -286,30 +265,6 @@ static __initdata struct dmi_blacklist d
 
 	/* Machines which have problems handling enabled local APICs */
 
-	{ local_apic_kills_bios, "Dell Inspiron", {
-			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			MATCH(DMI_PRODUCT_NAME, "Inspiron"),
-			NO_MATCH, NO_MATCH
-			} },
-
-	{ local_apic_kills_bios, "Dell Latitude", {
-			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
-			MATCH(DMI_PRODUCT_NAME, "Latitude"),
-			NO_MATCH, NO_MATCH
-			} },
-
-	{ local_apic_kills_bios, "IBM Thinkpad T20", {
-			MATCH(DMI_BOARD_VENDOR, "IBM"),
-			MATCH(DMI_BOARD_NAME, "264741U"),
-			NO_MATCH, NO_MATCH
-			} },
-
-	{ local_apic_kills_bios, "ASUS L3C", {
-			MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
-			MATCH(DMI_BOARD_NAME, "P4_L3C"),
-			NO_MATCH, NO_MATCH
-			} },
-
 	{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */
 			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
 			NO_MATCH, NO_MATCH, NO_MATCH
diff -urNp linux-2.6.8-gentoo-r3/drivers/acpi/bus.c linux-dsd/drivers/acpi/bus.c
--- linux-2.6.8-gentoo-r3/drivers/acpi/bus.c	2004-09-05 11:21:41.000000000 +0100
+++ linux-dsd/drivers/acpi/bus.c	2004-09-06 14:13:40.070834496 +0100
@@ -590,10 +590,9 @@ acpi_bus_init_irq (void)
 }
 
 
-static int __init
-acpi_bus_init (void)
+void __init
+acpi_early_init (void)
 {
-	int			result = 0;
 	acpi_status		status = AE_OK;
 	struct acpi_buffer	buffer = {sizeof(acpi_fadt), &acpi_fadt};
 
@@ -617,7 +616,7 @@ acpi_bus_init (void)
 	status = acpi_get_table(ACPI_TABLE_FADT, 1, &buffer);
 	if (ACPI_FAILURE(status)) {
 		printk(KERN_ERR PREFIX "Unable to get the FADT\n");
-		goto error1;
+		goto error0;
 	}
 
 #ifdef CONFIG_X86
@@ -640,12 +639,40 @@ acpi_bus_init (void)
 	}
 #endif
 
-	status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
+	status = acpi_enable_subsystem(~(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE));
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX "Unable to enable ACPI\n");
+		goto error0;
+	}
+
+	return;
+
+error0:
+	disable_acpi();
+	return;
+}
+
+static int __init
+acpi_bus_init (void)
+{
+	int			result = 0;
+	acpi_status		status = AE_OK;
+	extern acpi_status	acpi_os_initialize1(void);
+
+	ACPI_FUNCTION_TRACE("acpi_bus_init");
+
+	status = acpi_os_initialize1();
+
+	status = acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE);
 	if (ACPI_FAILURE(status)) {
 		printk(KERN_ERR PREFIX "Unable to start the ACPI Interpreter\n");
 		goto error1;
 	}
 
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX "Unable to initialize ACPI OS objects\n");
+		goto error1;
+	}
 #ifdef CONFIG_ACPI_EC
 	/*
 	 * ACPI 2.0 requires the EC driver to be loaded and work before
@@ -693,7 +720,6 @@ acpi_bus_init (void)
 	/* Mimic structured exception handling */
 error1:
 	acpi_terminate();
-error0:
 	return_VALUE(-ENODEV);
 }
 
diff -urNp linux-2.6.8-gentoo-r3/drivers/acpi/osl.c linux-dsd/drivers/acpi/osl.c
--- linux-2.6.8-gentoo-r3/drivers/acpi/osl.c	2004-09-05 11:21:41.000000000 +0100
+++ linux-dsd/drivers/acpi/osl.c	2004-09-06 14:13:40.081832824 +0100
@@ -71,6 +71,12 @@ static struct workqueue_struct *kacpid_w
 acpi_status
 acpi_os_initialize(void)
 {
+	return AE_OK;
+}
+
+acpi_status
+acpi_os_initialize1(void)
+{
 	/*
 	 * Initialize PCI configuration space access, as we'll need to access
 	 * it while walking the namespace (bus 0 and root bridges w/ _BBNs).
@@ -470,6 +476,8 @@ acpi_os_read_pci_configuration (struct a
 		return AE_ERROR;
 	}
 
+	BUG_ON(!raw_pci_ops);
+
 	result = raw_pci_ops->read(pci_id->segment, pci_id->bus,
 				PCI_DEVFN(pci_id->device, pci_id->function),
 				reg, size, value);
@@ -496,6 +504,8 @@ acpi_os_write_pci_configuration (struct 
 		return AE_ERROR;
 	}
 
+	BUG_ON(!raw_pci_ops);
+
 	result = raw_pci_ops->write(pci_id->segment, pci_id->bus,
 				PCI_DEVFN(pci_id->device, pci_id->function),
 				reg, size, value);
diff -urNp linux-2.6.8-gentoo-r3/init/main.c linux-dsd/init/main.c
--- linux-2.6.8-gentoo-r3/init/main.c	2004-09-05 11:21:41.000000000 +0100
+++ linux-dsd/init/main.c	2004-09-06 14:13:40.113827960 +0100
@@ -93,6 +93,11 @@ extern void free_initmem(void);
 extern void populate_rootfs(void);
 extern void driver_init(void);
 extern void prepare_namespace(void);
+#ifdef	CONFIG_ACPI
+extern void acpi_early_init(void);
+#else
+static inline acpi_early_init() { }
+#endif
 
 #ifdef CONFIG_TC
 extern void tc_init(void);
@@ -530,6 +535,8 @@ asmlinkage void __init start_kernel(void
 #endif
 	check_bugs();
 
+	acpi_early_init(); /* before LAPIC and SMP init */
+
 	/* 
 	 *	We count on the initial thread going ok 
 	 *	Like idlers init is an unlocked kernel thread, which will

Reply to: