Bug#273474: APM broken in image-2.6.8-1 version 2.6.8-3, worked in 2.6.8-1
On Tue, 28 Sep 2004, Marcus C. Gottwald wrote:
> I never used a "noacpi" command, always "acpi=off". And as far
> as I could see, ACPI was never turned on, only the messages
> regarding (the local?) APIC were different.
could you try to build latest kernel-source-2.6.8
with belows reverted patch and boot that?
save the mail and use 'patch -p1 -Rī
diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
--- a/arch/i386/kernel/dmi_scan.c 2004-08-19 12:35:05 -07:00
+++ b/arch/i386/kernel/dmi_scan.c 2004-08-19 12:35:05 -07:00
@@ -162,26 +162,6 @@
#define NO_MATCH { DMI_NONE, NULL}
#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.
@@ -793,30 +773,6 @@
} },
/* 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_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */
MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"),
diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c
--- a/drivers/acpi/bus.c 2004-08-19 12:35:05 -07:00
+++ b/drivers/acpi/bus.c 2004-08-19 12:35:05 -07:00
@@ -590,10 +590,9 @@
}
-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 @@
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 @@
}
#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 @@
/* Mimic structured exception handling */
error1:
acpi_terminate();
-error0:
return_VALUE(-ENODEV);
}
diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c
--- a/drivers/acpi/osl.c 2004-08-19 12:35:05 -07:00
+++ b/drivers/acpi/osl.c 2004-08-19 12:35:05 -07:00
@@ -71,6 +71,12 @@
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 @@
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);
@@ -495,6 +503,8 @@
default:
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),
diff -Nru a/init/main.c b/init/main.c
--- a/init/main.c 2004-08-19 12:35:05 -07:00
+++ b/init/main.c 2004-08-19 12:35:05 -07:00
@@ -91,6 +91,11 @@
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 void acpi_early_init(void) { }
+#endif
#ifdef CONFIG_TC
extern void tc_init(void);
@@ -481,6 +486,8 @@
proc_root_init();
#endif
check_bugs();
+
+ acpi_early_init(); /* before LAPIC and SMP init */
/*
* We count on the initial thread going ok
Reply to: