lkml.org 
[lkml]   [2018]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 157/350] PCI / ACPI: Enable wake automatically for power managed bridges
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mika Westerberg <mika.westerberg@linux.intel.com>

    [ Upstream commit 6299cf9ec3985cac70bede8a855b5087b81a6640 ]

    We enable power management automatically for bridges where
    pci_bridge_d3_possible() returns true. However, these bridges may have
    ACPI methods such as _DSW that need to be called before D3 entry. For
    example in Lenovo Thinkpad X1 Carbon 6th _DSW method is used to prepare
    D3cold for the PCIe root port hosting Thunderbolt chain. Because wake is
    not enabled _DSW method is never called and the port does not enter
    D3cold properly consuming more power than necessary.

    Users can work this around by writing "enabled" to "wakeup" sysfs file
    under the device in question but that is not something an ordinary user
    is expected to do.

    Since we already automatically enable power management for PCIe ports
    with ->bridge_d3 set extend that to enable wake for them as well,
    assuming the port has any ACPI wakeup related objects implemented in the
    namespace (adev->wakeup.flags.valid is true). This ensures the necessary
    ACPI methods get called at appropriate times and allows the root port in
    Thinkpad X1 Carbon 6th to go into D3cold.

    Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/pci/pci-acpi.c | 16 +++++++++++++++-
    1 file changed, 15 insertions(+), 1 deletion(-)

    --- a/drivers/pci/pci-acpi.c
    +++ b/drivers/pci/pci-acpi.c
    @@ -779,19 +779,33 @@ static void pci_acpi_setup(struct device
    return;

    device_set_wakeup_capable(dev, true);
    + /*
    + * For bridges that can do D3 we enable wake automatically (as
    + * we do for the power management itself in that case). The
    + * reason is that the bridge may have additional methods such as
    + * _DSW that need to be called.
    + */
    + if (pci_dev->bridge_d3)
    + device_wakeup_enable(dev);
    +
    acpi_pci_wakeup(pci_dev, false);
    }

    static void pci_acpi_cleanup(struct device *dev)
    {
    struct acpi_device *adev = ACPI_COMPANION(dev);
    + struct pci_dev *pci_dev = to_pci_dev(dev);

    if (!adev)
    return;

    pci_acpi_remove_pm_notifier(adev);
    - if (adev->wakeup.flags.valid)
    + if (adev->wakeup.flags.valid) {
    + if (pci_dev->bridge_d3)
    + device_wakeup_disable(dev);
    +
    device_set_wakeup_capable(dev, false);
    + }
    }

    static bool pci_acpi_bus_match(struct device *dev)

    \
     
     \ /
      Last update: 2018-11-12 00:31    [W:4.041 / U:0.344 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site