[PATCH 04/11] acpica: fwts_acpica: reworking required for new ACPICA changes

Keng-Yu Lin kengyu at canonical.com
Thu Apr 12 06:16:10 UTC 2012


On Thu, Apr 12, 2012 at 7:50 AM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/acpica/fwts_acpica.c |  496 ++++++++++++++++++++++++++++++++--------------
>  1 file changed, 351 insertions(+), 145 deletions(-)
>
> diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
> index 609dc8f..7d851e9 100644
> --- a/src/acpica/fwts_acpica.c
> +++ b/src/acpica/fwts_acpica.c
> @@ -80,6 +80,25 @@ static int                   fwts_acpica_force_sem_timeout;          /* > 0, forces a semaphore timeout
>  static bool                    fwts_acpica_init_called;                /* > 0, ACPICA initialised */
>  static fwts_acpica_log_callback fwts_acpica_log_callback_func = NULL;  /* logging call back func */
>
> +#define ACPI_ADR_SPACE_USER_DEFINED1        0x80
> +#define ACPI_ADR_SPACE_USER_DEFINED2        0xE4
> +
> +static ACPI_ADR_SPACE_TYPE fwts_space_id_list[] =
> +{
> +       ACPI_ADR_SPACE_SYSTEM_MEMORY,
> +       ACPI_ADR_SPACE_SYSTEM_IO,
> +       ACPI_ADR_SPACE_EC,
> +       ACPI_ADR_SPACE_SMBUS,
> +       ACPI_ADR_SPACE_CMOS,
> +       ACPI_ADR_SPACE_GSBUS,
> +       ACPI_ADR_SPACE_GPIO,
> +       ACPI_ADR_SPACE_PCI_BAR_TARGET,
> +       ACPI_ADR_SPACE_IPMI,
> +       ACPI_ADR_SPACE_FIXED_HARDWARE,
> +       ACPI_ADR_SPACE_USER_DEFINED1,
> +       ACPI_ADR_SPACE_USER_DEFINED2
> +};
> +
>  /* Semaphore Tracking */
>
>  /*
> @@ -126,17 +145,16 @@ void fwts_acpica_simulate_sem_timeout(int timeout)
>        fwts_acpica_force_sem_timeout = timeout;
>  }
>
> -
>  /*
>  *  hash_sem_handle()
>  *     generate a simple hash based on semaphore handle
>  */
>  static unsigned int hash_sem_handle(sem_t *sem)
> -{
> +{
>        unsigned int i = (unsigned int)((unsigned long)sem % MAX_SEMAPHORES);
>        int j;
>
> -       for (j=0;j<MAX_SEMAPHORES;j++) {
> +       for (j = 0; j<MAX_SEMAPHORES; j++) {
>                if (sem_hash_table[i].sem == sem)
>                        return i;
>                if (sem_hash_table[i].sem == NULL)
> @@ -175,61 +193,205 @@ static void hash_sem_dec_count(sem_t *sem)
>  /* ACPICA Handlers */
>
>  /*
> - *  fwtsNotifyHandler()
> + *  fwts_notify_handler()
>  *     Notify handler
>  */
> -static void fwtsNotifyHandler(ACPI_HANDLE Device, UINT32 Value, void *Context)
> +static void fwts_notify_handler(ACPI_HANDLE Device, UINT32 Value, void *Context)
> +{
> +       (void)AcpiEvaluateObject(Device, "_NOT", NULL, NULL);
> +}
> +
> +static void fwts_device_notify_handler(ACPI_HANDLE Device, UINT32 Value, void *Context)
>  {
> -       /* fwts_log_info(fwts_acpica_fw, "Received a notify 0x%X", Value); */
> +       (void)AcpiEvaluateObject(Device, "_NOT", NULL, NULL);
>  }
>
> -static UINT32 fwtsInterfaceHandler(ACPI_STRING InterfaceName, UINT32 Supported)
> +static UINT32 fwts_interface_handler(ACPI_STRING InterfaceName, UINT32 Supported)
>  {
>        return Supported;
>  }
>
> -static ACPI_STATUS fwtsTableHandler(UINT32 Event, void *Table, void *Context)
> +static ACPI_STATUS fwts_table_handler(UINT32 Event, void *Table, void *Context)
>  {
>        return AE_OK;
>  }
>
> -static ACPI_STATUS fwtsExceptionHandler(ACPI_STATUS AmlStatus, ACPI_NAME Name,
> -                                     UINT16 Opcode, UINT32 AmlOffset, void *Context)
> +static UINT32 fwts_event_handler(void *Context)
> +{
> +       return 0;
> +}
> +
> +static ACPI_STATUS fwts_exception_handler(
> +       ACPI_STATUS AmlStatus,
> +       ACPI_NAME Name,
> +       UINT16 Opcode,
> +       UINT32 AmlOffset,
> +       void *Context)
>  {
>        char *exception = (char*)AcpiFormatException(AmlStatus);
>
>        if (Name)
> -               fwts_log_info(fwts_acpica_fw, "ACPICA Exception %s during execution of method %4.4s", exception, (char*)&Name);
> +               fwts_log_info(fwts_acpica_fw,
> +                       "ACPICA Exception %s during execution of method %4.4s",
> +                       exception, (char*)&Name);
>        else
> -               fwts_log_info(fwts_acpica_fw, "ACPICA Exception %s during execution at module level (table load)", exception);
> +               fwts_log_info(fwts_acpica_fw,
> +                       "ACPICA Exception %s during execution at module level (table load)",
> +                       exception);
>
>        return AmlStatus;
>  }
>
> -static void fwtsDeviceNotifyHandler(ACPI_HANDLE device, UINT32 value, void *context)
> +static void fwts_attached_data_handler(ACPI_HANDLE obj, void *data)
>  {
> -    (void)AcpiEvaluateObject(device, "_NOT", NULL, NULL);
>  }
>
> -static void fwtsAttachedDataHandler(ACPI_HANDLE obj, void *data)
> +static ACPI_STATUS fwts_region_init(
> +       ACPI_HANDLE RegionHandle,
> +       UINT32 Function,
> +       void *HandlerContext,
> +       void **RegionContext)
>  {
> +       *RegionContext = RegionHandle;
> +       return AE_OK;
>  }
>
> -static ACPI_STATUS fwtsRegionInit(ACPI_HANDLE RegionHandle, UINT32 Function,
> -                                 void *HandlerContext, void **RegionContext)
> +static ACPI_STATUS fwts_region_handler(
> +       UINT32                  function,
> +       ACPI_PHYSICAL_ADDRESS   address,
> +       UINT32                  bitwidth,
> +       UINT64                  *value,
> +       void                    *handlercontext,
> +       void                    *regioncontext)
>  {
> -    *RegionContext = RegionHandle;
> -    return (AE_OK);
> -}
> +       ACPI_OPERAND_OBJECT     *regionobject = ACPI_CAST_PTR(ACPI_OPERAND_OBJECT, regioncontext);
> +       UINT8                   *buffer = ACPI_CAST_PTR(UINT8, value);
> +       ACPI_SIZE               length;
> +       UINT32                  bytewidth;
> +       ACPI_CONNECTION_INFO    *context;
> +       int                     i;
> +
> +       if (regionobject->Region.Type != ACPI_TYPE_REGION)
> +               return AE_OK;
> +
> +       context = ACPI_CAST_PTR (ACPI_CONNECTION_INFO, handlercontext);
> +       length = (ACPI_SIZE)regionobject->Region.Length;
> +
> +       switch (regionobject->Region.SpaceId) {
> +       case ACPI_ADR_SPACE_SYSTEM_IO:
> +               switch (function & ACPI_IO_MASK) {
> +               case ACPI_READ:
> +                       *value = 0;
> +                       break;
> +               case ACPI_WRITE:
> +                       break;
> +               default:
> +                       return AE_BAD_PARAMETER;
> +                       break;
> +               }
> +               break;
>
> -extern ACPI_STATUS
> -AeRegionHandler (
> -    UINT32                  Function,
> -    ACPI_PHYSICAL_ADDRESS   Address,
> -    UINT32                  BitWidth,
> -    UINT64                  *Value,
> -    void                    *HandlerContext,
> -    void                    *RegionContext);
> +       case ACPI_ADR_SPACE_SMBUS:
> +       case ACPI_ADR_SPACE_GSBUS:  /* ACPI 5.0 */
> +               length = 0;
> +
> +               switch (function & ACPI_IO_MASK) {
> +               case ACPI_READ:
> +                       switch (function >> 16) {
> +                       case AML_FIELD_ATTRIB_QUICK:
> +                       case AML_FIELD_ATTRIB_SEND_RCV:
> +                       case AML_FIELD_ATTRIB_BYTE:
> +                               length = 1;
> +                               break;
> +                       case AML_FIELD_ATTRIB_WORD:
> +                       case AML_FIELD_ATTRIB_WORD_CALL:
> +                               length = 2;
> +                               break;
> +                       case AML_FIELD_ATTRIB_BLOCK:
> +                       case AML_FIELD_ATTRIB_BLOCK_CALL:
> +                               length = 32;
> +                               break;
> +                       case AML_FIELD_ATTRIB_MULTIBYTE:
> +                       case AML_FIELD_ATTRIB_RAW_BYTES:
> +                       case AML_FIELD_ATTRIB_RAW_PROCESS:
> +                               length = context->AccessLength - 2;
> +                               break;
> +                       default:
> +                               break;
> +                       }
> +                       break;
> +
> +               case ACPI_WRITE:
> +                       switch (function >> 16) {
> +                       case AML_FIELD_ATTRIB_QUICK:
> +                       case AML_FIELD_ATTRIB_SEND_RCV:
> +                       case AML_FIELD_ATTRIB_BYTE:
> +                       case AML_FIELD_ATTRIB_WORD:
> +                       case AML_FIELD_ATTRIB_BLOCK:
> +                               length = 0;
> +                               break;
> +                       case AML_FIELD_ATTRIB_WORD_CALL:
> +                               length = 2;
> +                               break;
> +                       case AML_FIELD_ATTRIB_BLOCK_CALL:
> +                               length = 32;
> +                               break;
> +                       case AML_FIELD_ATTRIB_MULTIBYTE:
> +                       case AML_FIELD_ATTRIB_RAW_BYTES:
> +                       case AML_FIELD_ATTRIB_RAW_PROCESS:
> +                               length = context->AccessLength - 2;
> +                               break;
> +                       default:
> +                               break;
> +                       }
> +                       break;
> +               default:
> +                       break;
> +               }
> +               for (i = 0; i < length; i++)
> +                       buffer[i+2] = (UINT8)(0xA0 + i);
> +               buffer[0] = 0x7A;
> +               buffer[1] = (UINT8)length;
> +               return AE_OK;
> +
> +       case ACPI_ADR_SPACE_IPMI: /* ACPI 4.0 */
> +               buffer[0] = 0;       /* Status byte */
> +               buffer[1] = 64;      /* Return buffer data length */
> +               buffer[2] = 0;       /* Completion code */
> +               buffer[3] = 0;       /* Reserved */
> +               for (i = 4; i < 66; i++)
> +                       buffer[i] = (UINT8) (i);
> +               return AE_OK;
> +
> +       case ACPI_ADR_SPACE_SYSTEM_MEMORY:
> +       case ACPI_ADR_SPACE_EC:
> +       case ACPI_ADR_SPACE_CMOS:
> +       case ACPI_ADR_SPACE_GPIO:
> +       case ACPI_ADR_SPACE_PCI_BAR_TARGET:
> +       case ACPI_ADR_SPACE_FIXED_HARDWARE:
> +       case ACPI_ADR_SPACE_USER_DEFINED1:
> +       case ACPI_ADR_SPACE_USER_DEFINED2:
> +       default:
> +               bytewidth = (bitwidth / 8);
> +               if (bitwidth % 8)
> +                       bytewidth += 1;
> +
> +               switch (function) {
> +               case ACPI_READ:
> +                       /* Fake it, return all zeros */
> +                       memset(value, 0, bytewidth);
> +               break;
> +               case ACPI_WRITE:
> +                       /* Fake it, do nothing */
> +                       break;
> +               default:
> +                       return AE_BAD_PARAMETER;
> +               }
> +               return AE_OK;
> +       }
> +
> +       return AE_OK;
> +}
>
>  /*
>  *  AeLocalGetRootPointer()
> @@ -237,7 +399,7 @@ AeRegionHandler (
>  */
>  ACPI_PHYSICAL_ADDRESS AeLocalGetRootPointer(void)
>  {
> -       return ((ACPI_PHYSICAL_ADDRESS) fwts_acpica_RSDP);
> +       return (ACPI_PHYSICAL_ADDRESS)fwts_acpica_RSDP;
>  }
>
>  /*
> @@ -266,10 +428,10 @@ void fwts_acpica_debug_command(fwts_framework *fw, fwts_acpica_log_callback func
>  void fwts_acpica_vprintf(const char *fmt, va_list args)
>  {
>        static char *buffer;
> -       static int  buffer_len;
> +       static size_t buffer_len;
>
>        char tmp[4096];
> -       int tmp_len;
> +       size_t tmp_len;
>
>        vsnprintf(tmp, sizeof(tmp), fmt, args);
>        tmp_len = strlen(tmp);
> @@ -289,7 +451,7 @@ void fwts_acpica_vprintf(const char *fmt, va_list args)
>                else
>                        buffer_len = 0;
>        }
> -
> +
>        if (index(buffer, '\n') != NULL) {
>                if (fwts_acpica_log_callback_func)
>                        fwts_acpica_log_callback_func(fwts_acpica_fw, buffer);
> @@ -365,7 +527,7 @@ ACPI_STATUS AcpiOsWaitSemaphore(ACPI_HANDLE handle, UINT32 Units, UINT16 Timeout
>  *     Override ACPICA AcpiOsSignalSemaphore to keep track of semaphore releases
>  *     so that we can see if any methods are sloppy in their releases.
>  */
> -ACPI_STATUS AcpiOsSignalSemaphore (ACPI_HANDLE handle, UINT32 Units)
> +ACPI_STATUS AcpiOsSignalSemaphore(ACPI_HANDLE handle, UINT32 Units)
>  {
>        sem_t *sem = (sem_t *)handle;
>
> @@ -387,17 +549,17 @@ ACPI_STATUS AcpiOsSignalSemaphore (ACPI_HANDLE handle, UINT32 Units)
>  ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS addr, UINT32 *value, UINT32 width)
>  {
>        switch (width) {
> -               case 8:
> -                       *value = 0xFF;
> -                       break;
> -               case 16:
> -                       *value = 0xFFFF;
> -                       break;
> -               case 32:
> -                       *value = 0xFFFFFFFF;
> -                       break;
> -               default:
> -                       return AE_BAD_PARAMETER;
> +       case 8:
> +               *value = 0xFF;
> +               break;
> +       case 16:
> +               *value = 0xFFFF;
> +               break;
> +       case 32:
> +               *value = 0xFFFFFFFF;
> +               break;
> +       default:
> +               return AE_BAD_PARAMETER;
>        }
>        return AE_OK;
>  }
> @@ -409,39 +571,154 @@ ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS addr, UINT32 *value, UINT32 width)
>  ACPI_STATUS AcpiOsReadPciConfiguration(ACPI_PCI_ID *pciid, UINT32 reg, UINT64 *value, UINT32 width)
>  {
>        switch (width) {
> -               case 8:
> -                       *value = 0x00;
> -                       break;
> -               case 16:
> -                       *value = 0x0000;
> -                       break;
> -               case 32:
> -                       *value = 0x00000000;
> -                       break;
> -               default:
> -                       return AE_BAD_PARAMETER;
> +       case 8:
> +               *value = 0x00;
> +               break;
> +       case 16:
> +               *value = 0x0000;
> +               break;
> +       case 32:
> +               *value = 0x00000000;
> +               break;
> +       default:
> +               return AE_BAD_PARAMETER;
>        }
>        return AE_OK;
>  }
>
>  void AeTableOverride(ACPI_TABLE_HEADER *ExistingTable, ACPI_TABLE_HEADER **NewTable)
>  {
> -       if (strncmp(ExistingTable->Signature, ACPI_SIG_DSDT, 4) == 0)
> +       if (strncmp(ExistingTable->Signature, ACPI_SIG_DSDT, 4) == 0)
>                *NewTable = (ACPI_TABLE_HEADER*)fwts_acpica_DSDT;
>  }
>
> -ACPI_STATUS AcpiOsSignal (UINT32 function, void *info)
> +ACPI_STATUS AcpiOsSignal(UINT32 function, void *info)
>  {
> -    switch (function) {
> -    case ACPI_SIGNAL_BREAKPOINT:
> -       fwts_warning(fwts_acpica_fw, "Method contains an ACPICA breakpoint: %s\n", info ? (char*)info : "No Information");
> -       AcpiGbl_CmSingleStep = FALSE;
> -        break;
> -    case ACPI_SIGNAL_FATAL:
> -    default:
> -        break;
> -    }
> -    return AE_OK;
> +       switch (function) {
> +       case ACPI_SIGNAL_BREAKPOINT:
> +               fwts_warning(fwts_acpica_fw,
> +                       "Method contains an ACPICA breakpoint: %s\n",
> +                       info ? (char*)info : "No Information");
> +               AcpiGbl_CmSingleStep = FALSE;
> +               break;
> +       case ACPI_SIGNAL_FATAL:
> +       default:
> +               break;
> +       }
> +       return AE_OK;
> +}
> +
> +int fwtsInstallLateHandlers(fwts_framework *fw)
> +{
> +       int i;
> +
> +       if (!AcpiGbl_ReducedHardware) {
> +               if (AcpiInstallFixedEventHandler(ACPI_EVENT_GLOBAL, fwts_event_handler, NULL) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to install global event handler.");
> +                       return FWTS_ERROR;
> +               }
> +               if (AcpiInstallFixedEventHandler(ACPI_EVENT_RTC, fwts_event_handler, NULL) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to install RTC event handler.");
> +                       return FWTS_ERROR;
> +               }
> +       }
> +
> +       for (i = 0; i < ACPI_ARRAY_LENGTH(fwts_space_id_list); i++) {
> +               if (AcpiInstallAddressSpaceHandler(AcpiGbl_RootNode,
> +                   fwts_space_id_list[i], fwts_region_handler, fwts_region_init, NULL) != AE_OK) {
> +                       fwts_log_error(fw,
> +                               "Failed to install handler for %s space(%u)",
> +                               AcpiUtGetRegionName((UINT8)fwts_space_id_list[i]),
> +                               fwts_space_id_list[i]);
> +                       return FWTS_ERROR;
> +               }
> +       }
> +
> +       return FWTS_OK;
> +}
> +
> +int fwtsInstallEarlyHandlers(fwts_framework *fw)
> +{
> +       int i;
> +       ACPI_HANDLE     handle;
> +
> +       if (AcpiInstallInterfaceHandler(fwts_interface_handler) != AE_OK) {
> +               fwts_log_error(fw, "Failed to install interface handler.");
> +               return FWTS_ERROR;
> +       }
> +
> +       if (AcpiInstallTableHandler(fwts_table_handler, NULL) != AE_OK) {
> +               fwts_log_error(fw, "Failed to install table handler.");
> +               return FWTS_ERROR;
> +       }
> +
> +       if (AcpiInstallExceptionHandler(fwts_exception_handler) != AE_OK) {
> +               fwts_log_error(fw, "Failed to install exception handler.");
> +               return FWTS_ERROR;
> +       }
> +
> +       if (AcpiInstallNotifyHandler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, fwts_notify_handler, NULL) != AE_OK) {
> +               fwts_log_error(fw, "Failed to install system notify handler.");
> +               return FWTS_ERROR;
> +       }
> +
> +       if (AcpiInstallNotifyHandler(ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY, fwts_device_notify_handler, NULL) != AE_OK) {
> +               fwts_log_error(fw, "Failed to install device notify handler.");
> +               return FWTS_ERROR;
> +       }
> +
> +       if (AcpiGetHandle(NULL, "\\_SB", &handle) == AE_OK) {
> +               if (AcpiInstallNotifyHandler(handle, ACPI_SYSTEM_NOTIFY, fwts_notify_handler, NULL) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to install notify handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiRemoveNotifyHandler(handle, ACPI_SYSTEM_NOTIFY, fwts_notify_handler) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to remove notify handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, fwts_notify_handler, NULL) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to install notify handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiRemoveNotifyHandler(handle, ACPI_ALL_NOTIFY, fwts_notify_handler) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to remove notify handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, fwts_notify_handler, NULL) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to install notify handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiAttachData(handle, fwts_attached_data_handler, handle) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to attach data handler.");
> +                       return FWTS_ERROR;
> +               }
> +               if (AcpiDetachData(handle, fwts_attached_data_handler) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to detach data handler.");
> +                       return FWTS_ERROR;
> +               }
> +
> +               if (AcpiAttachData(handle, fwts_attached_data_handler, handle) != AE_OK) {
> +                       fwts_log_error(fw, "Failed to attach data handler.");
> +                       return FWTS_ERROR;
> +               }
> +       }
> +
> +       for (i = 0; i < ACPI_ARRAY_LENGTH(fwts_space_id_list); i++) {
> +               if (AcpiInstallAddressSpaceHandler(AcpiGbl_RootNode,
> +                   fwts_space_id_list[i], fwts_region_handler, fwts_region_init, NULL) != AE_OK) {
> +                       fwts_log_error(fw,
> +                               "Could not install an OpRegion handler for %s space(%u)",
> +                               AcpiUtGetRegionName((UINT8)fwts_space_id_list[i]),
> +                               fwts_space_id_list[i]);
> +                       return FWTS_ERROR;
> +               }
> +       }
> +       return FWTS_OK;
>  }
>
>
> @@ -451,12 +728,10 @@ ACPI_STATUS AcpiOsSignal (UINT32 function, void *info)
>  */
>  int fwts_acpica_init(fwts_framework *fw)
>  {
> -       ACPI_HANDLE handle;
>        int i;
>        int n;
>        UINT32 init_flags = ACPI_FULL_INITIALIZATION;
>        fwts_acpi_table_info *table;
> -       ACPI_ADR_SPACE_TYPE SpaceIdList[] = {0, 1, 3, 4, 5, 6, 7, 0x80};
>
>        /* Abort if already initialised */
>        if (fwts_acpica_init_called)
> @@ -517,7 +792,7 @@ int fwts_acpica_init(fwts_framework *fw)
>        } else {
>                fwts_acpica_FADT = NULL;
>        }
> -
> +
>        /* Clone XSDT, make it point to tables in user address space */
>        if (fwts_acpi_find_table(fw, "XSDT", 0, &table) != FWTS_OK)
>                return FWTS_ERROR;
> @@ -558,14 +833,14 @@ int fwts_acpica_init(fwts_framework *fw)
>                return FWTS_ERROR;
>        if (table) {
>                uint32_t *entries;
> -
> +
>                fwts_acpica_RSDT = fwts_low_calloc(1, table->length);
>                if (fwts_acpica_RSDT == NULL) {
>                        fwts_log_error(fw, "Out of memory allocating RSDT.");
>                        return FWTS_ERROR;
>                }
>                memcpy(fwts_acpica_RSDT, table->data, sizeof(ACPI_TABLE_HEADER));
> -
> +
>                n = (table->length - sizeof(ACPI_TABLE_HEADER)) / sizeof(uint32_t);
>                entries = (uint32_t*)(table->data + sizeof(ACPI_TABLE_HEADER));
>                for (i=0; i<n; i++) {
> @@ -621,80 +896,11 @@ int fwts_acpica_init(fwts_framework *fw)
>                return FWTS_ERROR;
>        }
>
> -       /* Install handlers */
> -       if (AcpiInstallInterfaceHandler(fwtsInterfaceHandler) != AE_OK) {
> -               fwts_log_error(fw, "Failed to install interface handler.");
> -               return FWTS_ERROR;
> -       }
> -       if (AcpiInstallTableHandler(fwtsTableHandler, NULL) != AE_OK) {
> -               fwts_log_error(fw, "Failed to install table handler.");
> -               return FWTS_ERROR;
> -       }
> -       if (AcpiInstallExceptionHandler(fwtsExceptionHandler) != AE_OK) {
> -               fwts_log_error(fw, "Failed to install exception handler.");
> -               return FWTS_ERROR;
> -       }
> -       if (AcpiInstallNotifyHandler( ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, fwtsNotifyHandler, NULL) != AE_OK) {
> -               fwts_log_error(fw, "Failed to install notify handler.");
> -               return FWTS_ERROR;
> -       }
> -       if (AcpiInstallNotifyHandler( ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY, fwtsDeviceNotifyHandler, NULL) != AE_OK) {
> -               fwts_log_error(fw, "Failed to install notify handler.");
> -               return FWTS_ERROR;
> -       }
> -       if (AcpiGetHandle(NULL, "\\_SB", &handle) == AE_OK) {
> -#if 0
> -               if (AcpiInstallNotifyHandler(handle, ACPI_SYSTEM_NOTIFY, fwtsNotifyHandler, NULL) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to install notify handler.");
> -                       return FWTS_ERROR;
> -               }
> -               if (AcpiRemoveNotifyHandler(handle, ACPI_SYSTEM_NOTIFY, fwtsNotifyHandler) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to remove notify handler.");
> -                       return FWTS_ERROR;
> -               }
> -               if (AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, fwtsNotifyHandler, NULL) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to install notify handler.");
> -                       return FWTS_ERROR;
> -               }
> -               if (AcpiRemoveNotifyHandler(handle, ACPI_ALL_NOTIFY, fwtsNotifyHandler) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to remove notify handler.");
> -                       return FWTS_ERROR;
> -               }
> -#endif
> -               if (AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, fwtsNotifyHandler, NULL) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to install notify handler.");
> -                       return FWTS_ERROR;
> -               }
> -#if 0
> -               if (AcpiAttachData(handle, fwtsAttachedDataHandler, handle) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to attach data handler.");
> -                       return FWTS_ERROR;
> -               }
> -               if (AcpiDetachData(handle, fwtsAttachedDataHandler) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to detach data handler.");
> -                       return FWTS_ERROR;
> -               }
> -#endif
> -               if (AcpiAttachData(handle, fwtsAttachedDataHandler, handle) != AE_OK) {
> -                       fwts_log_error(fw, "Failed to attach data handler.");
> -                       return FWTS_ERROR;
> -               }
> -       }
> -
> -       for (i = 0; i < AEXEC_NUM_REGIONS; i++) {
> -               AcpiRemoveAddressSpaceHandler (AcpiGbl_RootNode, SpaceIdList[i], AeRegionHandler);
> -               if (AcpiInstallAddressSpaceHandler (AcpiGbl_RootNode,
> -                        SpaceIdList[i], AeRegionHandler, fwtsRegionInit, NULL) != AE_OK) {
> -                       fwts_log_error(fw, "Could not install an OpRegion handler for %s space(%u)",
> -                       AcpiUtGetRegionName((UINT8)SpaceIdList[i]), SpaceIdList[i]);
> -                       return FWTS_ERROR;
> -               }
> -        }
>
> +       (void)fwtsInstallEarlyHandlers(fw);
>        AcpiEnableSubsystem(init_flags);
>        AcpiInitializeObjects(init_flags);
> -
> -       AcpiDbCommandDispatch ("methods", NULL, NULL);
> +       (void)fwtsInstallLateHandlers(fw);
>
>        fwts_acpica_init_called = true;
>
> @@ -763,8 +969,8 @@ fwts_list *fwts_acpica_get_object_names(int type)
>        fwts_list *list;
>
>        if ((list = fwts_list_new()) != NULL)
> -               AcpiWalkNamespace (type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
> +               AcpiWalkNamespace(type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
>                        fwts_acpi_walk_for_object_names, NULL, list, NULL);
> -
> +
>        return list;
>  }
> --
> 1.7.9.5
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>


More information about the fwts-devel mailing list