• Rajat Jain's avatar
    ACPI: PM: Set enable_for_wake for wakeup GPEs during suspend-to-idle · 707edfd5
    Rajat Jain authored
    commit 2f844b61 upstream.
    
    I noticed that recently multiple systems (chromebooks) couldn't wake
    from S0ix using LID or Keyboard after updating to a newer kernel. I
    bisected and it turned up commit f941d3e4 ("ACPI: EC / PM: Disable
    non-wakeup GPEs for suspend-to-idle"). I checked that the issue got
    fixed if that commit was reverted.
    
    I debugged and found that although PNP0C0D:00 (representing the LID)
    is wake capable and should wakeup the system per the code in
    acpi_wakeup_gpe_init() and in drivers/acpi/button.c:
    
    localhost /sys # cat /proc/acpi/wakeup
    Device  S-state   Status   Sysfs node
    LID0      S4    *enabled   platform:PNP0C0D:00
    CREC      S5    *disabled  platform:GOOG0004:00
                    *disabled  platform:cros-ec-dev.1.auto
                    *disabled  platform:cros-ec-accel.0
                    *disabled  platform:cros-ec-accel.1
                    *disabled  platform:cros-ec-gyro.0
                    *disabled  platform:cros-ec-ring.0
                    *disabled  platform:cros-usbpd-charger.2.auto
                    *disabled  platform:cros-usbpd-logger.3.auto
    D015      S3    *enabled   i2c:i2c-ELAN0000:00
    PENH      S3    *enabled   platform:PRP0001:00
    XHCI      S3    *enabled   pci:0000:00:14.0
    GLAN      S4    *disabled
    WIFI      S3    *disabled  pci:0000:00:14.3
    localhost /sys #
    
    On debugging, I found that its corresponding GPE is not being enabled.
    The particular GPE's "gpe_register_info->enable_for_wake" does not
    have any bits set when acpi_enable_all_wakeup_gpes() comes around to
    use it. I looked at code and could not find any other code path that
    should set the bits in "enable_for_wake" bitmask for the wake enabled
    devices for s2idle.  [I do see that it happens for S3 in
    acpi_sleep_prepare()].
    
    Thus I used the same call to enable the GPEs for wake enabled devices,
    and verified that this fixes the regression I was seeing on multiple
    of my devices.
    
    [ rjw: The problem is that commit f941d3e4 ("ACPI: EC / PM:
      Disable non-wakeup GPEs for suspend-to-idle") forgot to add
      the acpi_enable_wakeup_devices() call for s2idle along with
      acpi_enable_all_wakeup_gpes(). ]
    
    Fixes: f941d3e4 ("ACPI: EC / PM: Disable non-wakeup GPEs for suspend-to-idle")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=203579Signed-off-by: default avatarRajat Jain <rajatja@google.com>
    [ rjw: Subject & changelog ]
    Cc: 5.0+ <stable@vger.kernel.org> # 5.0+
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    707edfd5
sleep.c 31.9 KB