diff -r 7e7ede748b3e usr/src/uts/intel/io/acpica/acpica.c --- a/usr/src/uts/intel/io/acpica/acpica.c Mon Nov 14 18:42:00 2011 -0500 +++ b/usr/src/uts/intel/io/acpica/acpica.c Sat Nov 19 14:04:23 2011 -0500 @@ -217,6 +217,13 @@ rv = AE_ERROR; } + if (AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, + ACPI_ADR_SPACE_EC, + acpica_ec_handler, NULL, NULL) != AE_OK) { + cmn_err(CE_WARN, "!acpica: can't install handler for" + " Embedded Controller"); + /* XXX: rv = AE_ERROR; ignore, for now */ + } return (rv); } diff -r 7e7ede748b3e usr/src/uts/intel/io/acpica/acpica_ec.c --- a/usr/src/uts/intel/io/acpica/acpica_ec.c Mon Nov 14 18:42:00 2011 -0500 +++ b/usr/src/uts/intel/io/acpica/acpica_ec.c Sat Nov 19 14:04:23 2011 -0500 @@ -111,13 +111,6 @@ /* * ACPI CA address space handler interface functions */ -/*ARGSUSED*/ -static ACPI_STATUS -ec_setup(ACPI_HANDLE reg, UINT32 func, void *context, void **ret) -{ - - return (AE_OK); -} /* * Only called from ec_handler(), which validates ec_ok @@ -248,8 +241,8 @@ return (rv); } -static ACPI_STATUS -ec_handler(UINT32 func, ACPI_PHYSICAL_ADDRESS addr, UINT32 width, +ACPI_STATUS +acpica_ec_handler(UINT32 func, ACPI_PHYSICAL_ADDRESS addr, UINT32 width, ACPI_INTEGER *val, void *context, void *regcontext) { _NOTE(ARGUNUSED(context, regcontext)) @@ -429,6 +422,12 @@ } /* + * Enable the acpica_ec_handler now that we have: + * ec.ec_sc, ec.ec_base + */ + ec.ec_ok = 1; + + /* * Get GPE */ buf.Length = ACPI_ALLOCATE_BUFFER; @@ -447,28 +446,7 @@ } /* - * Initialize EC mutex here - */ - mutex_init(&ec.ec_mutex, NULL, MUTEX_DRIVER, NULL); - - /* - * Assume the EC handler is available now; the next attempt - * to install the address space handler may actually need - * to use the EC handler to install it (chicken/egg) - */ - ec.ec_ok = 1; - - if (AcpiInstallAddressSpaceHandler(obj, - ACPI_ADR_SPACE_EC, &ec_handler, &ec_setup, NULL) != AE_OK) { - cmn_err(CE_WARN, "!acpica: failed to add EC handler\n"); - ec.ec_ok = 0; /* EC handler failed to install */ - membar_producer(); /* force ec_ok store before mutex_destroy */ - mutex_destroy(&ec.ec_mutex); - return (AE_ERROR); - } - - /* - * In case the EC handler was successfully installed but no + * In case the EC handler was successfully enabled but no * GPE was found, return sucess; a warning was emitted above */ if (gpe < 0) @@ -543,6 +521,11 @@ void acpica_ec_init(void) { + /* + * Initialize EC mutex here + */ + mutex_init(&ec.ec_mutex, NULL, MUTEX_DRIVER, NULL); + #ifdef NOTYET /* * Search the ACPI tables for an ECDT; if diff -r 7e7ede748b3e usr/src/uts/intel/sys/acpica.h --- a/usr/src/uts/intel/sys/acpica.h Mon Nov 14 18:42:00 2011 -0500 +++ b/usr/src/uts/intel/sys/acpica.h Sat Nov 19 14:04:23 2011 -0500 @@ -191,6 +191,8 @@ extern ACPI_STATUS acpica_get_cpu_id_by_object(ACPI_HANDLE, processorid_t *); extern ACPI_STATUS acpica_get_apicid_by_object(ACPI_HANDLE, UINT32 *); extern ACPI_STATUS acpica_get_procid_by_object(ACPI_HANDLE, UINT32 *); +extern ACPI_STATUS acpica_ec_handler(UINT32, ACPI_PHYSICAL_ADDRESS, UINT32, + ACPI_INTEGER *, void *, void *); extern uint64_t acpica_get_core_feature(uint64_t); extern void acpica_set_core_feature(uint64_t);