1. 13 4月, 2021 2 次提交
  2. 09 4月, 2021 1 次提交
  3. 23 3月, 2021 1 次提交
  4. 27 1月, 2021 1 次提交
  5. 07 12月, 2020 1 次提交
    • R
      PM: ACPI: PCI: Drop acpi_pm_set_bridge_wakeup() · 7482c5cb
      Rafael J. Wysocki 提交于
      The idea behind acpi_pm_set_bridge_wakeup() was to allow bridges to
      be reference counted for wakeup enabling, because they may be enabled
      to signal wakeup on behalf of their subordinate devices and that
      may happen for multiple times in a row, whereas for the other devices
      it only makes sense to enable wakeup signaling once.
      
      However, this becomes problematic if the bridge itself is suspended,
      because it is treated as a "regular" device in that case and the
      reference counting doesn't work.
      
      For instance, suppose that there are two devices below a bridge and
      they both can signal wakeup.  Every time one of them is suspended,
      wakeup signaling is enabled for the bridge, so when they both have
      been suspended, the bridge's wakeup reference counter value is 2.
      
      Say that the bridge is suspended subsequently and acpi_pci_wakeup()
      is called for it.  Because the bridge can signal wakeup, that
      function will invoke acpi_pm_set_device_wakeup() to configure it
      and __acpi_pm_set_device_wakeup() will be called with the last
      argument equal to 1.  This causes __acpi_device_wakeup_enable()
      invoked by it to omit the reference counting, because the reference
      counter of the target device (the bridge) is 2 at that time.
      
      Now say that the bridge resumes and one of the device below it
      resumes too, so the bridge's reference counter becomes 0 and
      wakeup signaling is disabled for it, but there is still the other
      suspended device which may need the bridge to signal wakeup on its
      behalf and that is not going to work.
      
      To address this scenario, use wakeup enable reference counting for
      all devices, not just for bridges, so drop the last argument from
      __acpi_device_wakeup_enable() and __acpi_pm_set_device_wakeup(),
      which causes acpi_pm_set_device_wakeup() and
      acpi_pm_set_bridge_wakeup() to become identical, so drop the latter
      and use the former instead of it everywhere.
      
      Fixes: 1ba51a7c ("ACPI / PCI / PM: Rework acpi_pci_propagate_wakeup()")
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      Cc: 4.14+ <stable@vger.kernel.org> # 4.14+
      7482c5cb
  6. 28 7月, 2020 1 次提交
    • L
      ACPI/IORT: Add an input ID to acpi_dma_configure() · b8e069a2
      Lorenzo Pieralisi 提交于
      Some HW devices are created as child devices of proprietary busses,
      that have a bus specific policy defining how the child devices
      wires representing the devices ID are translated into IOMMU and
      IRQ controllers device IDs.
      
      Current IORT code provides translations for:
      
      - PCI devices, where the device ID is well identified at bus level
        as the requester ID (RID)
      - Platform devices that are endpoint devices where the device ID is
        retrieved from the ACPI object IORT mappings (Named components single
        mappings). A platform device is represented in IORT as a named
        component node
      
      For devices that are child devices of proprietary busses the IORT
      firmware represents the bus node as a named component node in IORT
      and it is up to that named component node to define in/out bus
      specific ID translations for the bus child devices that are
      allocated and created in a bus specific manner.
      
      In order to make IORT ID translations available for proprietary
      bus child devices, the current ACPI (and IORT) code must be
      augmented to provide an additional ID parameter to acpi_dma_configure()
      representing the child devices input ID. This ID is bus specific
      and it is retrieved in bus specific code.
      
      By adding an ID parameter to acpi_dma_configure(), the IORT
      code can map the child device ID to an IOMMU stream ID through
      the IORT named component representing the bus in/out ID mappings.
      Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: Hanjun Guo <guohanjun@huawei.com>
      Cc: Sudeep Holla <sudeep.holla@arm.com>
      Cc: Robin Murphy <robin.murphy@arm.com>
      Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
      Link: https://lore.kernel.org/r/20200619082013.13661-6-lorenzo.pieralisi@arm.comSigned-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      b8e069a2
  7. 09 5月, 2020 1 次提交
  8. 21 3月, 2020 1 次提交
  9. 15 10月, 2019 2 次提交
  10. 06 7月, 2019 1 次提交
    • D
      ACPI: PM: Make acpi_sleep_state_supported() non-static · ad5a449b
      Dexuan Cui 提交于
      With some upcoming patches to save/restore the Hyper-V drivers related
      states, a Linux VM running on Hyper-V will be able to hibernate. When
      a Linux VM hibernates, unluckily we must disable the memory hot-add/remove
      and balloon up/down capabilities in the hv_balloon driver
      (drivers/hv/hv_balloon.c), because these can not really work according to
      the design of the related back-end driver on the host.
      
      By default, Hyper-V does not enable the virtual ACPI S4 state for a VM;
      on recent Hyper-V hosts, the administrator is able to enable the virtual
      ACPI S4 state for a VM, so we hope to use the presence of the virtual ACPI
      S4 state as a hint for hv_balloon to disable the aforementioned
      capabilities. In this way, hibernation will work more reliably, from the
      user's perspective.
      
      By marking acpi_sleep_state_supported() non-static, we'll be able to
      implement a hv_is_hibernation_supported() API in the always-built-in
      module arch/x86/hyperv/hv_init.c, and the API will be called by hv_balloon.
      Signed-off-by: NDexuan Cui <decui@microsoft.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      ad5a449b
  11. 04 7月, 2019 1 次提交
  12. 27 6月, 2019 1 次提交
    • M
      ACPI / PM: Introduce concept of a _PR0 dependent device · 4533771c
      Mika Westerberg 提交于
      If there are shared power resources between otherwise unrelated devices
      turning them on causes the other devices sharing them to be powered up
      as well. In case of PCI devices go into D0uninitialized state meaning
      that if they were configured to trigger wake that configuration is lost
      at this point.
      
      For this reason introduce a concept of "_PR0 dependent device" that can
      be added to any ACPI device that has power resources. The dependent
      device will be included in a list of dependent devices for all power
      resources returned by the ACPI device's _PR0 (assuming it has one).
      Whenever a power resource having dependent devices is turned physically
      on (its _ON method is called) we runtime resume all of them to allow
      their driver or in case of PCI the PCI core to re-initialize the device
      and its wake configuration.
      
      This adds two functions that can be used to add and remove these
      dependent devices. Note the dependent device does not necessary need
      share power resources so this functionality can be used to add "software
      dependencies" as well if needed.
      Signed-off-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      4533771c
  13. 31 5月, 2019 1 次提交
    • T
      treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 · c942fddf
      Thomas Gleixner 提交于
      Based on 3 normalized pattern(s):
      
        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
      
        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 [author] [kishon] [vijay] [abraham]
        [i] [kishon]@[ti] [com] 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
      
        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 [author] [graeme] [gregory]
        [gg]@[slimlogic] [co] [uk] [author] [kishon] [vijay] [abraham] [i]
        [kishon]@[ti] [com] [based] [on] [twl6030]_[usb] [c] [author] [hema]
        [hk] [hemahk]@[ti] [com] 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
      
      extracted by the scancode license scanner the SPDX license identifier
      
        GPL-2.0-or-later
      
      has been chosen to replace the boilerplate/reference in 1105 file(s).
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: NAllison Randal <allison@lohutok.net>
      Reviewed-by: NRichard Fontana <rfontana@redhat.com>
      Reviewed-by: NKate Stewart <kstewart@linuxfoundation.org>
      Cc: linux-spdx@vger.kernel.org
      Link: https://lkml.kernel.org/r/20190527070033.202006027@linutronix.deSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c942fddf
  14. 10 5月, 2019 1 次提交
    • P
      ACPI: bus: change _ADR representation to 64 bits · ca6f998c
      Pierre-Louis Bossart 提交于
      Standards such as the MIPI DisCo for SoundWire 1.0 specification
      assume the _ADR field is 64 bits.
      
      _ADR is defined as an "Integer" represented as 64 bits since ACPI 2.0
      released in 2002. The low levels already use _ADR as 64 bits, e.g. in
      struct acpi_device_info.
      
      This patch bumps the representation used for sysfs to 64 bits. To
      avoid any compatibility/ABI issues, the printf format is only extended
      to 16 characters when the actual _ADR value exceeds the 32 bit
      maximum.
      
      Example with a SoundWire device, the results show the complete
      vendorID and linkID which were omitted before:
      
      Before:
      $ more /sys/bus/acpi/devices/device\:38/adr
      0x5d070000
      After:
      $ more /sys/bus/acpi/devices/device\:38/adr
      0x000010025d070000
      Signed-off-by: NPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      [ rjw: Replace 0xFFFFFFFF with U32_MAX, clean up subject ]
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      ca6f998c
  15. 23 4月, 2019 1 次提交
  16. 01 4月, 2019 2 次提交
  17. 03 10月, 2018 1 次提交
  18. 08 9月, 2018 1 次提交
  19. 04 4月, 2018 1 次提交
  20. 10 1月, 2018 1 次提交
  21. 21 11月, 2017 1 次提交
    • L
      ACPI / EC: Fix regression related to PM ops support in ECDT device · a64a62ce
      Lv Zheng 提交于
      On platforms (ASUS X550ZE and possibly all ASUS X series) with valid ECDT
      EC but invalid DSDT EC, EC PM ops won't be invoked as ECDT EC is not an
      ACPI device. Thus the following commit actually removed post-resume
      acpi_ec_enable_event() invocation for such platforms, and triggered a
      regression on them that after being resumed, EC (actually should be ECDT)
      driver stops handling EC events:
      
       Commit: c2b46d67
       Subject: ACPI / EC: Add PM operations to improve event handling for resume process
      
      Notice that the root cause actually is "ECDT is not an ACPI device" rather
      than "the timing of acpi_ec_enable_event() invocation", this patch fixes
      this issue by enumerating ECDT EC as an ACPI device. Due to the existence
      of the noirq stage, the ability of tuning the timing of
      acpi_ec_enable_event() invocation is still meaningful.
      
      This patch is a little bit different from the posted fix by moving
      acpi_config_boot_ec() from acpi_ec_ecdt_start() to acpi_ec_add() to make
      sure that EC event handling won't be stopped as long as the ACPI EC driver
      is bound. Thus the following sequence shouldn't disable EC event handling:
      unbind,suspend,resume,bind.
      
      Fixes: c2b46d67 (ACPI / EC: Add PM operations to improve event handling for resume process)
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=196847Reported-by: NLuya Tshimbalanga <luya@fedoraproject.org>
      Tested-by: NLuya Tshimbalanga <luya@fedoraproject.org>
      Cc: 4.9+ <stable@vger.kernel.org> # 4.9+
      Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      a64a62ce
  22. 20 10月, 2017 1 次提交
  23. 20 9月, 2017 1 次提交
    • J
      ACPI / bus: Make ACPI_HANDLE() work for non-GPL code again · 9e987b70
      John Hubbard 提交于
      Due to commit db3e50f3 (device property: Get rid of struct
      fwnode_handle type field), ACPI_HANDLE() inadvertently became
      a GPL-only call. The call path that led to that was:
      
      ACPI_HANDLE()
          ACPI_COMPANION()
              to_acpi_device_node()
                  is_acpi_device_node()
                      acpi_device_fwnode_ops
                          DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops);
      
      ...and the new DECLARE_ACPI_FWNODE_OPS() includes
      EXPORT_SYMBOL_GPL, whereas previously it was a static struct.
      
      In order to avoid changing any of that, let's instead provide ever
      so slightly better encapsulation of those struct fwnode_operations
      instances. Those do not really need to be directly used in
      inline function calls in header files. Simply moving two small
      functions (is_acpi_device_node and is_acpi_data_node) out of
      acpi_bus.h, and into a .c file, does that.
      
      That leaves the internals of struct fwnode_operations as GPL-only
      (which I think was the intent all along), but un-breaks any driver
      code out there that relies on the ACPI subsystem's being (historically)
      an EXPORT_SYMBOL-usable system. By that, I mean, ACPI_HANDLE() and
      other basic ACPI calls were non-GPL-protected.
      
      Also, while I'm there, remove a tiny bit of redundancy that was missed
      in the earlier commit, by having is_acpi_node() use the other two
      routines, instead of checking fwnode directly.
      
      Fixes: db3e50f3 (device property: Get rid of struct fwnode_handle type field)
      Signed-off-by: NJohn Hubbard <jhubbard@nvidia.com>
      Acked-by: NSakari Ailus <sakari.ailus@linux.intel.com>
      Acked-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      9e987b70
  24. 07 8月, 2017 1 次提交
    • L
      ACPI: Introduce DMA ranges parsing · c04ac679
      Lorenzo Pieralisi 提交于
      Some devices have limited addressing capabilities and cannot
      reference the whole memory address space while carrying out DMA
      operations (eg some devices with bus address bits range smaller than
      system bus - which prevents them from using bus addresses that are
      otherwise valid for the system).
      
      The ACPI _DMA object allows bus devices to define the DMA window that is
      actually addressable by devices that sit upstream the bus, therefore
      providing a means to parse and initialize the devices DMA masks and
      addressable DMA range size.
      
      By relying on the generic ACPI kernel layer to retrieve and parse
      resources, introduce ACPI core code to parse the _DMA object.
      Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Tested-by: NNate Watterson <nwatters@codeaurora.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      c04ac679
  25. 01 8月, 2017 2 次提交
    • R
      ACPI / PCI / PM: Rework acpi_pci_propagate_wakeup() · 1ba51a7c
      Rafael J. Wysocki 提交于
      The acpi_pci_propagate_wakeup() routine is there to handle cases in
      which PCI bridges (or PCIe ports) are expected to signal wakeup
      for devices below them, but currently it doesn't do that correctly.
      
      The problem is that acpi_pci_propagate_wakeup() uses
      acpi_pm_set_device_wakeup() for bridges and if that routine is
      called for multiple times to disable wakeup for the same device,
      it will disable it on the first invocation and the next calls
      will have no effect (it works analogously when called to enable
      wakeup, but that is not a problem).
      
      Now, say acpi_pci_propagate_wakeup() has been called for two
      different devices under the same bridge and it has called
      acpi_pm_set_device_wakeup() for that bridge each time.  The
      bridge is now enabled to generate wakeup signals.  Next,
      suppose that one of the devices below it resumes and
      acpi_pci_propagate_wakeup() is called to disable wakeup for that
      device.  It will then call acpi_pm_set_device_wakeup() for the bridge
      and that will effectively disable remote wakeup for all devices under
      it even though some of them may still be suspended and remote wakeup
      may be expected to work for them.
      
      To address this (arguably theoretical) issue, allow
      wakeup.enable_count under struct acpi_device to grow beyond 1 in
      certain situations.  In particular, allow that to happen in
      acpi_pci_propagate_wakeup() when wakeup is enabled or disabled
      for PCI bridges, so that wakeup is actually disabled for the
      bridge when all devices under it resume and not when just one
      of them does that.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NAndy Shevchenko <andy.shevchenko@gmail.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      1ba51a7c
    • R
      ACPI / PM: Split acpi_device_wakeup() · 99d8845e
      Rafael J. Wysocki 提交于
      To prepare for a subsequent change and make the code somewhat easier
      to follow, do the following in the ACPI device wakeup handling code:
      
       * Replace wakeup.flags.enabled under struct acpi_device with
         wakeup.enable_count as that will be necessary going forward.
      
         For now, wakeup.enable_count is not allowed to grow beyond 1,
         so the current behavior is retained.
      
       * Split acpi_device_wakeup() into acpi_device_wakeup_enable()
         and acpi_device_wakeup_disable() and modify the callers of
         it accordingly.
      
       * Introduce a new acpi_wakeup_lock mutex to protect the wakeup
         enabling/disabling code from races in case it is executed
         more than once in parallel for the same device (which may
         happen for bridges theoretically).
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      99d8845e
  26. 22 7月, 2017 3 次提交
  27. 28 6月, 2017 3 次提交
    • R
      PCI / PM: Drop pme_interrupt flag from struct pci_dev · 8370c2dc
      Rafael J. Wysocki 提交于
      The pme_interrupt flag in struct pci_dev is set when PMEs generated
      by the device are going to be signaled via root port PME interrupts.
      
      Ironically enough, that information is only used by the code setting
      up device wakeup through ACPI which returns as soon as it sees the
      pme_interrupt flag set while setting up "remote runtime wakeup".
      That is questionable, however, because in theory there may be PCIe
      devices using out-of-band PME signaling under root ports handled
      by the native PME code or devices requiring wakeup power setup to be
      carried out by AML.  For such devices, ACPI wakeup should be invoked
      regardless of whether or not native PME signaling is used in general.
      
      For this reason, drop the pme_interrupt flag and rework the code
      using it which then allows the ACPI-based device wakeup handling
      in PCI to be consolidated to use one code path for both "runtime
      remote wakeup" and system wakeup (from sleep states).
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      8370c2dc
    • R
      ACPI / PM: Consolidate device wakeup settings code · 4d183d04
      Rafael J. Wysocki 提交于
      Currently, there are two separate ways of handling device wakeup
      settings in the ACPI core, depending on whether this is runtime
      wakeup or system wakeup (from sleep states).  However, after the
      previous commit eliminating the run_wake ACPI device wakeup flag,
      there is no difference between the two any more at the ACPI level,
      so they can be combined.
      
      For this reason, introduce acpi_pm_set_device_wakeup() to replace both
      acpi_pm_device_run_wake() and acpi_pm_device_sleep_wake() and make it
      check the ACPI device object's wakeup.valid flag to determine whether
      or not the device can be set up to generate wakeup signals.
      
      Also notice that zpodd_enable/disable_run_wake() only call
      device_set_run_wake() because acpi_pm_device_run_wake() called
      device_run_wake(), which is not done by acpi_pm_set_device_wakeup(),
      so drop the now redundant device_set_run_wake() calls from there.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      4d183d04
    • R
      ACPI / PM: Drop run_wake from struct acpi_device_wakeup_flags · a1a66393
      Rafael J. Wysocki 提交于
      The run_wake flag in struct acpi_device_wakeup_flags stores the
      information on whether or not the device can generate wakeup
      signals at run time, but in ACPI that really is equivalent to
      being able to generate wakeup signals at all.
      
      In fact, run_wake will always be set after successful executeion of
      acpi_setup_gpe_for_wake(), but if that fails, the device will not be
      able to use a wakeup GPE at all, so it won't be able to wake up the
      systems from sleep states too.  Hence, run_wake actually means that
      the device is capable of triggering wakeup and so it is equivalent
      to the valid flag.
      
      For this reason, drop run_wake from struct acpi_device_wakeup_flags
      and make sure that the valid flag is only set if
      acpi_setup_gpe_for_wake() has been successful.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      a1a66393
  28. 22 6月, 2017 1 次提交
    • J
      ACPI / scan: Fix enumeration for special SPI and I2C devices · e4330d8b
      Jarkko Nikula 提交于
      Commit f406270b ("ACPI / scan: Set the visited flag for all
      enumerated devices") caused that two group of special SPI or I2C
      devices do not enumerate. SPI and I2C devices are expected to be
      enumerated by the SPI and I2C subsystems but change caused that
      acpi_bus_attach() marks those devices with acpi_device_set_enumerated().
      
      First group of devices are matched using Device Tree compatible property
      with special _HID "PRP0001". Those devices have matched scan handler,
      acpi_scan_attach_handler() retuns 1 and acpi_bus_attach() marks them
      with acpi_device_set_enumerated().
      
      Second group of devices without valid _HID such as "LNXVIDEO" have
      device->pnp.type.platform_id set to zero and change again marks them
      with acpi_device_set_enumerated().
      
      Fix this by flagging the SPI and I2C devices during struct acpi_device
      object initialization time and let the code in acpi_bus_attach() to go
      through the device_attach() and acpi_default_enumeration() path for all
      SPI and I2C devices.
      
      Fixes: f406270b (ACPI / scan: Set the visited flag for all enumerated devices)
      Signed-off-by: NJarkko Nikula <jarkko.nikula@linux.intel.com>
      Acked-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Cc: 4.11+ <stable@vger.kernel.org> # 4.11+
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      e4330d8b
  29. 15 6月, 2017 2 次提交
    • R
      ACPI / PM: Ignore spurious SCI wakeups from suspend-to-idle · 33e4f80e
      Rafael J. Wysocki 提交于
      The ACPI SCI (System Control Interrupt) is set up as a wakeup IRQ
      during suspend-to-idle transitions and, consequently, any events
      signaled through it wake up the system from that state.  However,
      on some systems some of the events signaled via the ACPI SCI while
      suspended to idle should not cause the system to wake up.  In fact,
      quite often they should just be discarded.
      
      Arguably, systems should not resume entirely on such events, but in
      order to decide which events really should cause the system to resume
      and which are spurious, it is necessary to resume up to the point
      when ACPI SCIs are actually handled and processed, which is after
      executing dpm_resume_noirq() in the system resume path.
      
      For this reasons, add a loop around freeze_enter() in which the
      platforms can process events signaled via multiplexed IRQ lines
      like the ACPI SCI and add suspend-to-idle hooks that can be
      used for this purpose to struct platform_freeze_ops.
      
      In the ACPI case, the ->wake hook is used for checking if the SCI
      has triggered while suspended and deferring the interrupt-induced
      system wakeup until the events signaled through it are actually
      processed sufficiently to decide whether or not the system should
      resume.  In turn, the ->sync hook allows all of the relevant event
      queues to be flushed so as to prevent events from being missed due
      to race conditions.
      
      In addition to that, some ACPI code processing wakeup events needs
      to be modified to use the "hard" version of wakeup triggers, so that
      it will cause a system resume to happen on device-induced wakeup
      events even if the "soft" mechanism to prevent the system from
      suspending is not enabled.  However, to preserve the existing
      behavior with respect to suspend-to-RAM, this only is done in
      the suspend-to-idle case and only if an SCI has occurred while
      suspended.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      33e4f80e
    • R
      ACPI / PM: Run wakeup notify handlers synchronously · 64fd1c70
      Rafael J. Wysocki 提交于
      The work functions provided by the users of acpi_add_pm_notifier()
      should be run synchronously before re-enabling the wakeup GPE in
      case they are used to clear the status and/or disable the wakeup
      signaling at the source.  Otherwise, which is the case currently in
      the PCI bus type code, the same wakeup event may be signaled for
      multiple times while the execution of the work function in response
      to it has already been queued up.
      
      Fortunately, acpi_add_pm_notifier() is only used by PCI and by
      ACPI device PM code internally, so the change is relatively
      straightforward to make.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NBjorn Helgaas <bhelgaas@google.com>
      64fd1c70
  30. 07 6月, 2017 1 次提交
  31. 27 4月, 2017 1 次提交
    • H
      ACPI / bus: Introduce a list of ids for "always present" devices · b7ecf663
      Hans de Goede 提交于
      Several Bay / Cherry Trail devices (all of which ship with Windows 10) hide
      the LPSS PWM controller in ACPI, typically the _STA method looks like this:
      
          Method (_STA, 0, NotSerialized)  // _STA: Status
          {
              If (OSID == One)
              {
                  Return (Zero)
              }
      
              Return (0x0F)
          }
      
      Where OSID is some dark magic seen in all Cherry Trail ACPI tables making
      the machine behave differently depending on which OS it *thinks* it is
      booting, this gets set in a number of ways which we cannot control, on
      some newer machines it simple hardcoded to "One" aka win10.
      
      This causes the PWM controller to get hidden, which means Linux cannot
      control the backlight level on cht based tablets / laptops.
      
      Since loading the driver for this does no harm (the only in kernel user
      of it is the i915 driver, which will only uses it when it needs it), this
      commit makes acpi_bus_get_status() always set status to ACPI_STA_DEFAULT
      for the LPSS PWM device, fixing the lack of backlight control.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      [ rjw: Rename the new file to utils.c ]
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      b7ecf663