lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 168/293] ACPI / EC: Add support to skip boot stage DSDT probe
    Date
    From: Lv Zheng <lv.zheng@intel.com>

    [ Upstream commit c712bb58d8278465b1a91f362a08f5c79ad077e4 ]

    We prepared _INI/_STA methods for \_SB, \_SB.PCI0, \_SB.LID0 and
    \_SB.EC, _HID(PNP0C09)/_CRS/_GPE for \_SB.EC to poke Windows behavior
    with qemu, we got the following execution sequence:

    \_SB._INI
    \_SB.PCI0._STA
    \_SB.LID0._STA
    \_SB.EC._STA
    \_SB.PCI0._INI
    \_SB.LID0._INI
    \_SB.EC._INI

    There is no extra DSDT EC device enumeration process occurring before
    the main ACPI device enumeration process. That means acpi_ec_dsdt_probe()
    is not Windows-compatible.

    Tracking back, it was added by the following commit:

    Commit: c5279dee26c0e8d7c4200993bfc4b540d2469598
    Subject: ACPI: EC: Add some basic check for ECDT data

    but that commit was misguided.

    Why we shouldn't enumerate DSDT EC before the main ACPI device
    enumeration?

    The only way to know if the DSDT EC is valid would be to evaluate its
    _STA control method, but it's not safe to evaluate this control method
    that early and out of the ACPI enumeration process, because _STA may
    refer to entities (such as resources or ACPI device objects) that may
    not have been initialized before OSPM starts to enumerate them via
    the main ACPI device enumeration.

    But after we had reverted back to the expected behavior, a regression
    was reported. On that platform, there is no ECDT, but the platform
    control methods access EC operation region earlier than Linux expects
    causing some ACPI method execution errors. For this reason, we just
    go back to old behavior to still probe DSDT EC as the boot EC.

    However, that turns out to lead to yet another functional breakage
    and in order to work around all of the problems, we skip boot stage
    DSDT probe when the ECDT exists so that a later quirk can always use
    correct ECDT GPE setting.

    Link: http://bugzilla.kernel.org/show_bug.cgi?id=11880
    Link: http://bugzilla.kernel.org/show_bug.cgi?id=119261
    Link: http://bugzilla.kernel.org/show_bug.cgi?id=195651
    Tested-by: Daniel Drake <drake@endlessm.com>
    Signed-off-by: Lv Zheng <lv.zheng@intel.com>
    [ rjw: Changelog & comments massage ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/acpi/ec.c | 14 ++++++++++++++
    1 file changed, 14 insertions(+)

    diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
    index 217b0bac33d9..d4e8a17d939a 100644
    --- a/drivers/acpi/ec.c
    +++ b/drivers/acpi/ec.c
    @@ -1693,12 +1693,26 @@ static const struct acpi_device_id ec_device_ids[] = {
    {"", 0},
    };

    +/*
    + * This function is not Windows-compatible as Windows never enumerates the
    + * namespace EC before the main ACPI device enumeration process. It is
    + * retained for historical reason and will be deprecated in the future.
    + */
    int __init acpi_ec_dsdt_probe(void)
    {
    acpi_status status;
    struct acpi_ec *ec;
    int ret;

    + /*
    + * If a platform has ECDT, there is no need to proceed as the
    + * following probe is not a part of the ACPI device enumeration,
    + * executing _STA is not safe, and thus this probe may risk of
    + * picking up an invalid EC device.
    + */
    + if (boot_ec)
    + return -ENODEV;
    +
    ec = acpi_ec_alloc();
    if (!ec)
    return -ENOMEM;
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 04:09    [W:5.580 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site