Index: acpica/OsdInterrupt.c =================================================================== RCS file: /usr/cvs/thinit/src/sys/dev.acpi/acpica/OsdInterrupt.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- acpica/OsdInterrupt.c 19 Mar 2010 16:48:13 -0000 1.1 +++ acpica/OsdInterrupt.c 19 Mar 2010 16:53:58 -0000 1.2 @@ -69,9 +69,12 @@ LIST_ENTRY(acpi_interrupt_handler) aih_list; UINT32 aih_intrnum; ACPI_OSD_HANDLER aih_func; + void *aih_context; void *aih_ih; + int aih_deferred; }; +static int pre_acpi_md_callback = 1; static LIST_HEAD(, acpi_interrupt_handler) acpi_interrupt_list = LIST_HEAD_INITIALIZER(&acpi_interrupt_list); @@ -102,6 +105,15 @@ aih->aih_intrnum = InterruptNumber; aih->aih_func = ServiceRoutine; + aih->aih_context = Context; + aih->aih_deferred = pre_acpi_md_callback; + + if (pre_acpi_md_callback) { + mutex_enter(&acpi_interrupt_list_mtx); + LIST_INSERT_HEAD(&acpi_interrupt_list, aih, aih_list); + mutex_exit(&acpi_interrupt_list_mtx); + return AE_OK; + } rv = acpi_md_OsInstallInterruptHandler(InterruptNumber, ServiceRoutine, Context, &aih->aih_ih); @@ -115,6 +127,27 @@ return_ACPI_STATUS(rv); } +void +acpi_mi_callback(void) +{ + struct acpi_interrupt_handler *aih; + ACPI_STATUS rv; + + mutex_enter(&acpi_interrupt_list_mtx); + + LIST_FOREACH(aih, &acpi_interrupt_list, aih_list) { + rv = acpi_md_OsInstallInterruptHandler(aih->aih_intrnum, + aih->aih_func, aih->aih_context, &aih->aih_ih); + if (rv != AE_OK) + panic("Unable to setup deferred ACPI interrupt"); + aih->aih_deferred = 0; + } + + pre_acpi_md_callback = 0; + + mutex_exit(&acpi_interrupt_list_mtx); +} + /* * AcpiOsRemoveInterruptHandler: * @@ -139,7 +172,8 @@ aih->aih_func == ServiceRoutine) { LIST_REMOVE(aih, aih_list); mutex_exit(&acpi_interrupt_list_mtx); - acpi_md_OsRemoveInterruptHandler(aih->aih_ih); + if (aih->aih_deferred == 0) + acpi_md_OsRemoveInterruptHandler(aih->aih_ih); free(aih, M_ACPI); return_ACPI_STATUS(AE_OK); } Index: acpi.c =================================================================== RCS file: /usr/cvs/thinit/src/sys/dev.acpi/acpi.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- acpi.c 19 Mar 2010 16:53:34 -0000 1.4 +++ acpi.c 19 Mar 2010 16:53:58 -0000 1.5 @@ -456,22 +456,7 @@ acpi_osd_debugger(); #endif -#define ACPI_ENABLE_PHASE1 \ - (ACPI_NO_HANDLER_INIT | ACPI_NO_EVENT_INIT) -#define ACPI_ENABLE_PHASE2 \ - (ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE | \ - ACPI_NO_ADDRESS_SPACE_INIT) - - rv = AcpiEnableSubsystem(ACPI_ENABLE_PHASE1); - if (ACPI_FAILURE(rv)) { - aprint_error_dev(self, "unable to enable ACPI: %s\n", - AcpiFormatException(rv)); - return; - } - - acpi_md_callback(); - - rv = AcpiEnableSubsystem(ACPI_ENABLE_PHASE2); + rv = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION); if (ACPI_FAILURE(rv)) { aprint_error_dev(self, "unable to enable ACPI: %s\n", AcpiFormatException(rv)); @@ -488,6 +473,10 @@ AcpiFormatException(rv)); return; } + + acpi_md_callback(); + acpi_mi_callback(); + acpi_active = 1; /* Our current state is "awake". */