[PATCH] acpi: add in a tool to dump GPE information (LP: #1283473)

Colin Ian King colin.king at canonical.com
Wed Feb 26 14:49:55 UTC 2014


On 26/02/14 10:07, IvanHu wrote:
> On 02/26/2014 05:36 PM, Colin Ian King wrote:
>> On 26/02/14 06:28, IvanHu wrote:
>>> On 02/23/2014 12:50 AM, Colin King wrote:
>>>> From: Colin Ian King <colin.king at canonical.com>
>>>>
>>>> It can be useful to be able to extract the internal GPE configuration
>>>> from ACPICA and dump it out.
>>>>
>>>> Signed-off-by: Colin Ian King <colin.king at canonical.com>
>>>> ---
>>>>    src/Makefile.am            |   1 +
>>>>    src/acpi/gpedump/gpedump.c | 181
>>>> +++++++++++++++++++++++++++++++++++++++++++++
>>>>    2 files changed, 182 insertions(+)
>>>>    create mode 100644 src/acpi/gpedump/gpedump.c
>>>>
>>>> diff --git a/src/Makefile.am b/src/Makefile.am
>>>> index d3c1f45..155cba1 100644
>>>> --- a/src/Makefile.am
>>>> +++ b/src/Makefile.am
>>>> @@ -37,6 +37,7 @@ fwts_SOURCES = main.c                 \
>>>>        acpi/dmar/dmar.c             \
>>>>        acpi/fadt/fadt.c             \
>>>>        acpi/fan/fan.c                 \
>>>> +    acpi/gpedump/gpedump.c            \
>>>>        acpi/lid/lid.c                 \
>>>>        acpi/mcfg/mcfg.c             \
>>>>        acpi/method/method.c             \
>>>> diff --git a/src/acpi/gpedump/gpedump.c b/src/acpi/gpedump/gpedump.c
>>>> new file mode 100644
>>>> index 0000000..45404f4
>>>> --- /dev/null
>>>> +++ b/src/acpi/gpedump/gpedump.c
>>>> @@ -0,0 +1,181 @@
>>>> +/*
>>>> + * Copyright (C) 2014 Canonical
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or
>>>> + * modify it under the terms of the GNU General Public License
>>>> + * as published by the Free Software Foundation; either version 2
>>>> + * of the License, or (at your option) any later version.
>>>> + *
>>>> + * This program is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + * GNU General Public License for more details.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public License
>>>> + * along with this program; if not, write to the Free Software
>>>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>>>> 02110-1301, USA.
>>>> + *
>>>> + */
>>>> +#include "fwts.h"
>>>> +#include <stdint.h>
>>>> +#include <stdbool.h>
>>>> +#include <unistd.h>
>>>
>>> build error for the gcc version 4.6.3,
>>> May need to add
>>> #include <inttypes.h>
>>>
>>> acpi/gpedump/gpedump.c: In function ‘gpu_dump_gpes’:
>>> acpi/gpedump/gpedump.c:85:43: error: expected ‘)’ before ‘PRIu32’
>>> acpi/gpedump/gpedump.c:85:43: error: spurious trailing ‘%’ in format
>>> [-Werror=format]
>>> acpi/gpedump/gpedump.c:85:43: error: spurious trailing ‘%’ in format
>>> [-Werror=format]
>>> acpi/gpedump/gpedump.c:88:3: error: expected ‘)’ before ‘PRIx8’
>>> acpi/gpedump/gpedump.c:88:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:90:3: error: expected ‘)’ before ‘PRIx8’
>>> acpi/gpedump/gpedump.c:90:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c: In function ‘gpedump_block’:
>>> acpi/gpedump/gpedump.c:117:2: error: expected ‘)’ before ‘PRIu32’
>>> acpi/gpedump/gpedump.c:117:2: error: spurious trailing ‘%’ in format
>>> [-Werror=format]
>>> acpi/gpedump/gpedump.c:123:2: error: expected ‘)’ before ‘PRIx8’
>>> acpi/gpedump/gpedump.c:123:2: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:127:2: error: expected ‘)’ before ‘PRIu32’
>>> acpi/gpedump/gpedump.c:127:2: error: spurious trailing ‘%’ in format
>>> [-Werror=format]
>>> acpi/gpedump/gpedump.c:135:3: error: expected ‘)’ before ‘PRIu32’
>>> acpi/gpedump/gpedump.c:135:3: error: spurious trailing ‘%’ in format
>>> [-Werror=format]
>>> acpi/gpedump/gpedump.c:140:3: error: expected ‘)’ before ‘PRIx8’
>>> acpi/gpedump/gpedump.c:140:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:142:3: error: expected ‘)’ before ‘PRIx8’
>>> acpi/gpedump/gpedump.c:142:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:144:3: error: expected ‘)’ before ‘PRIx64’
>>> acpi/gpedump/gpedump.c:144:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:146:3: error: expected ‘)’ before ‘PRIx64’
>>> acpi/gpedump/gpedump.c:146:3: error: conversion lacks type at end of
>>> format [-Werror=format]
>>> acpi/gpedump/gpedump.c:132:27: error: unused variable ‘gpe_reg_info’
>>> [-Werror=unused-variable]
>>> acpi/gpedump/gpedump.c:100:23: error: unused parameter ‘gpe_xrupt_info’
>>> [-Werror=unused-parameter]
>>> acpi/gpedump/gpedump.c:102:11: error: unused parameter ‘block’
>>> [-Werror=unused-parameter]
>>> cc1: all warnings being treated as errors
>>> make[3]: *** [acpi/gpedump/fwts-gpedump.o] Error 1
>>> make[3]: Leaving directory `/home/work/fwts/src'
>>> make[2]: *** [all-recursive] Error 1
>>> make[2]: Leaving directory `/home/work/fwts/src'
>>> make[1]: *** [all-recursive] Error 1
>>> make[1]: Leaving directory `/home/work/fwts'
>>> make: *** [all] Error 2
>>>
>>>
>>>> +
>>>> +/* acpica headers */
>>>> +#include "acpi.h"
>>>> +#include "aclocal.h"
>>>> +#include "acobject.h"
>>>> +#include "acstruct.h"
>>>> +#include "acglobal.h"
>>>> +#include "fwts_acpi_object_eval.h"
>>>> +
>>>> +/*
>>>> + *  gpedump_init()
>>>> + *    initialize ACPI
>>>> + */
>>>> +static int gpedump_init(fwts_framework *fw)
>>>> +{
>>>> +    if (fwts_acpi_init(fw) != FWTS_OK) {
>>>> +        fwts_log_error(fw, "Cannot initialise ACPI.");
>>>> +        return FWTS_ERROR;
>>>> +    }
>>>> +
>>>> +    return FWTS_OK;
>>>> +}
>>>> +
>>>> +/*
>>>> + *  gpedump_deinit
>>>> + *    de-intialize ACPI
>>>> + */
>>>> +static int gpedump_deinit(fwts_framework *fw)
>>>> +{
>>>> +    return fwts_acpi_deinit(fw);
>>>> +}
>>>> +
>>>> +static void gpu_dump_gpes(
>>>> +    fwts_framework *fw,
>>>> +    uint32_t reg,
>>>> +    ACPI_GPE_BLOCK_INFO *gpe_block_info)
>>>> +{
>>>> +    uint32_t i, gpe = ACPI_GPE_REGISTER_WIDTH * reg;
>>>> +
>>>> +    for (i = 0; i < ACPI_GPE_REGISTER_WIDTH; i++, gpe++) {
>>>> +        char buf[80];
>>>> +        uint32_t n;
>>>> +        ACPI_GPE_NOTIFY_INFO *notify_info;
>>>> +        ACPI_GPE_EVENT_INFO *GpeEventInfo =
>>>> &gpe_block_info->EventInfo[gpe];
>>>> +
>>>> +        if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
>>>> ACPI_GPE_DISPATCH_NONE)
>>>> +            continue;
>>>> +
>>>> +        switch (GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) {
>>>> +        case ACPI_GPE_DISPATCH_NONE:
>>>> +            strncpy(buf, "none", sizeof(buf));
>>>> +            break;
>>>> +        case ACPI_GPE_DISPATCH_HANDLER:
>>>> +            strncpy(buf, "handler", sizeof(buf));
>>>> +            break;
>>>> +        case ACPI_GPE_DISPATCH_METHOD:
>>>> +            strncpy(buf, "method", sizeof(buf));
>>>> +            break;
>>>> +        case ACPI_GPE_DISPATCH_NOTIFY:
>>>> +            for (n = 0, notify_info =
>>>> GpeEventInfo->Dispatch.NotifyList; notify_info; notify_info =
>>>> notify_info->Next)
>>>> +                n++;
>>>> +            snprintf(buf, sizeof(buf), "notifes %" PRIu32 " devices",
>>>> n);
>>>> +            break;
>>>> +        }
>>>> +        fwts_log_info_verbatum(fw, "      GPE 0x%2.2" PRIx8 ":",
>>>> +            gpe_block_info->BlockBaseNumber + gpe);
>>>> +        fwts_log_info_verbatum(fw, "        Flags:    0x%2.2" PRIx8 "
>>>> (trigger: %s, wake: %s)",
>>>> +            GpeEventInfo->Flags,
>>>> +            GpeEventInfo->Flags & ACPI_GPE_LEVEL_TRIGGERED ? "level"
>>>> : "edge",
>>>> +            GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE ? "can wake" :
>>>> "run only");
>>>> +        fwts_log_info_verbatum(fw, "        Dispatch: %s", buf);
>>>> +    }
>>>> +}
>>>> +
>>>> +static void gpedump_block(
>>>> +    fwts_framework *fw,
>>>> +    ACPI_GPE_XRUPT_INFO    *gpe_xrupt_info,
>>>> +    ACPI_GPE_BLOCK_INFO    *gpe_block_info,
>>>> +    uint32_t block)
>>>> +{
>>>> +    ACPI_BUFFER    buffer;
>>>> +    ACPI_STATUS    Status;
>>>> +    uint32_t    reg;
>>>> +    char         name[128];
>>>> +
>>>> +    buffer.Length = sizeof(name);
>>>> +    buffer.Pointer = name;
>>>> +
>>>> +    Status = AcpiGetName (gpe_block_info->Node, ACPI_FULL_PATHNAME,
>>>> &buffer);
>>>> +    if (ACPI_FAILURE (Status))
>>>> +        strncpy(name, "unknown", sizeof(name));
>>>> +
>>>> +    fwts_log_nl(fw);
>>>> +    fwts_log_info_verbatum(fw, "Block %" PRIu32": DeviceNode %s
>>>> (%s)\n",
>>>> +        block, name,
>>>> +        gpe_block_info->Node == AcpiGbl_FadtGpeDevice ?
>>>> +            "FADT Defined GPE Block" :
>>>> +            "GPE Block Device");
>>>> +
>>>> +    fwts_log_info_verbatum(fw, "  GPE range: 0x%2.2" PRIx8 " to
>>>> 0x%2.2" PRIx8 " on interrupt %" PRIu32 "\n",
>>>> +        (uint8_t)gpe_block_info->BlockBaseNumber,
>>>> +        (uint8_t)gpe_block_info->BlockBaseNumber +
>>>> (gpe_block_info->GpeCount - 1),
>>>> +        (uint32_t)gpe_xrupt_info->InterruptNumber);
>>>> +    fwts_log_info_verbatum(fw, "  GPE count: %" PRIu32 " (%" PRIu32 "
>>>> registers)\n",
>>>> +        (uint32_t)gpe_block_info->GpeCount,
>>>> +        (uint32_t)gpe_block_info->RegisterCount);
>>>> +
>>>> +    for (reg = 0; reg < gpe_block_info->RegisterCount; reg++) {
>>>> +        ACPI_GPE_REGISTER_INFO *gpe_reg_info =
>>>> &gpe_block_info->RegisterInfo[reg];
>>>> +
>>>> +        fwts_log_nl(fw);
>>>> +        fwts_log_info_verbatum(fw,
>>>> +            "    Register %" PRIu32 ": (GPE 0x%2.2" PRIx8 "-0x%2.2"
>>>> PRIx8 ")",
>>>> +            reg,
>>>> +            gpe_reg_info->BaseGpeNumber,
>>>> +            gpe_reg_info->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH -
>>>> 1));
>>>> +        fwts_log_info_verbatum(fw, "      Run Enable:     0x%2.2"
>>>> PRIx8,
>>>> +            gpe_reg_info->EnableForRun);
>>>> +        fwts_log_info_verbatum(fw, "      Wake Enable:    0x%2.2"
>>>> PRIx8,
>>>> +            gpe_reg_info->EnableForWake);
>>>> +        fwts_log_info_verbatum(fw, "      Status Address: 0x%8.8"
>>>> PRIx64,
>>>> +            (uint64_t)gpe_reg_info->StatusAddress.Address);
>>>> +        fwts_log_info_verbatum(fw, "      Enable Address: 0x%8.8"
>>>> PRIx64,
>>>> +            (uint64_t)gpe_reg_info->EnableAddress.Address);
>>>> +
>>>> +        gpu_dump_gpes(fw, reg, gpe_block_info);
>>>> +    }
>>>> +}
>>>> +
>>>> +static int gpedump_test1(fwts_framework *fw)
>>>> +{
>>>> +    ACPI_GPE_BLOCK_INFO     *gpe_block_info;
>>>> +    ACPI_GPE_XRUPT_INFO     *gpe_xrupt_info;
>>>> +    uint32_t        block = 0;
>>>> +
>>>> +    gpe_xrupt_info = AcpiGbl_GpeXruptListHead;
>>>> +
>>>> +    for (gpe_xrupt_info = AcpiGbl_GpeXruptListHead; gpe_xrupt_info;
>>>> gpe_xrupt_info = gpe_xrupt_info->Next) {
>>>> +        for (gpe_block_info = gpe_xrupt_info->GpeBlockListHead;
>>>> gpe_block_info; gpe_block_info = gpe_block_info->Next) {
>>>> +            gpedump_block(fw, gpe_xrupt_info, gpe_block_info, block);
>>>> +            block++;
>>>> +        }
>>>> +    }
>>>> +    return FWTS_OK;
>>>> +}
>>>> +
>>>> +static fwts_framework_minor_test gpedump_tests[] = {
>>>> +    { gpedump_test1, "Dump GPEs." },
>>>> +    { NULL, NULL }
>>>> +};
>>>> +
>>>> +static fwts_framework_ops gpedump_ops = {
>>>> +    .description = "Dump GPEs.",
>>>> +    .init        = gpedump_init,
>>>> +    .deinit      = gpedump_deinit,
>>>> +    .minor_tests = gpedump_tests
>>>> +};
>>>> +
>>>> +FWTS_REGISTER("gpedump", &gpedump_ops, FWTS_TEST_ANYTIME,
>>>> FWTS_FLAG_UTILS);
>>>>
>>>
>>> please also help to check why I got the exceptions on ACPICA, when run
>>> gpedump tool.
>>>
>>> gpedump: Dump GPEs.
>>> --------------------------------------------------------------------------------
>>>
>>>
>>> ACPICA Exception AE_NOT_EXIST during execution at module level (table
>>> load)
>>> ACPICA Exception AE_NOT_EXIST during execution at module level (table
>>> load)
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> ACPICA Exception AE_NOT_EXIST during execution of method _STA
>>> Test 1 of 1: Dump GPEs.
>>>
>>>
>>> Cheers,
>>> Ivan
>>>
>>>
>>>
>> Ivan, send me a copy of your ACPI tables and I will debug this
>>
> 
> Attached the acpidump.

This is what I got when running it against those tables:

Command: "fwts --dumpfile=acpidump.log gpedump -".
Running tests: gpedump.

gpedump: Dump GPEs.
------------------------------------------------------------------------------------------------------------------
Test 1 of 1: Dump GPEs.

Block 0: DeviceNode \_GPE (FADT Defined GPE Block)
  GPE range: 0x00 to 0x7f on interrupt 9
  GPE count: 128 (16 registers)

    Register 0: (GPE 0x00-0x07)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001880
      Enable Address: 0x00001890

    Register 1: (GPE 0x08-0x0f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001881
      Enable Address: 0x00001891
      GPE 0x0f:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method

    Register 2: (GPE 0x10-0x17)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001882
      Enable Address: 0x00001892
      GPE 0x11:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method

    Register 3: (GPE 0x18-0x1f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001883
      Enable Address: 0x00001893

    Register 4: (GPE 0x20-0x27)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001884
      Enable Address: 0x00001894

    Register 5: (GPE 0x28-0x2f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001885
      Enable Address: 0x00001895

    Register 6: (GPE 0x30-0x37)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001886
      Enable Address: 0x00001896

    Register 7: (GPE 0x38-0x3f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001887
      Enable Address: 0x00001897

    Register 8: (GPE 0x40-0x47)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001888
      Enable Address: 0x00001898

    Register 9: (GPE 0x48-0x4f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x00001889
      Enable Address: 0x00001899

    Register 10: (GPE 0x50-0x57)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188a
      Enable Address: 0x0000189a

    Register 11: (GPE 0x58-0x5f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188b
      Enable Address: 0x0000189b

    Register 12: (GPE 0x60-0x67)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188c
      Enable Address: 0x0000189c
      GPE 0x61:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method
      GPE 0x62:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method
      GPE 0x66:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method
      GPE 0x67:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method

    Register 13: (GPE 0x68-0x6f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188d
      Enable Address: 0x0000189d
      GPE 0x69:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method
      GPE 0x6b:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method
      GPE 0x6d:
        Flags:    0x05 (trigger: level, wake: run only)
        Dispatch: method

    Register 14: (GPE 0x70-0x77)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188e
      Enable Address: 0x0000189e

    Register 15: (GPE 0x78-0x7f)
      Run Enable:     0x00
      Wake Enable:    0x00
      Status Address: 0x0000188f
      Enable Address: 0x0000189f




More information about the fwts-devel mailing list