1. 28 6月, 2017 1 次提交
  2. 07 2月, 2017 2 次提交
  3. 01 11月, 2016 2 次提交
    • R
      PM / runtime: Optimize the use of device links · baa8809f
      Rafael J. Wysocki 提交于
      If the device has no links to suppliers that should be used for
      runtime PM (links with DEVICE_LINK_PM_RUNTIME set), there is no
      reason to walk the list of suppliers for that device during
      runtime suspend and resume.
      
      Add a simple mechanism to detect that case and possibly avoid the
      extra unnecessary overhead.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      baa8809f
    • R
      driver core: Functional dependencies tracking support · 9ed98953
      Rafael J. Wysocki 提交于
      Currently, there is a problem with taking functional dependencies
      between devices into account.
      
      What I mean by a "functional dependency" is when the driver of device
      B needs device A to be functional and (generally) its driver to be
      present in order to work properly.  This has certain consequences
      for power management (suspend/resume and runtime PM ordering) and
      shutdown ordering of these devices.  In general, it also implies that
      the driver of A needs to be working for B to be probed successfully
      and it cannot be unbound from the device before the B's driver.
      
      Support for representing those functional dependencies between
      devices is added here to allow the driver core to track them and act
      on them in certain cases where applicable.
      
      The argument for doing that in the driver core is that there are
      quite a few distinct use cases involving device dependencies, they
      are relatively hard to get right in a driver (if one wants to
      address all of them properly) and it only gets worse if multiplied
      by the number of drivers potentially needing to do it.  Morever, at
      least one case (asynchronous system suspend/resume) cannot be handled
      in a single driver at all, because it requires the driver of A to
      wait for B to suspend (during system suspend) and the driver of B to
      wait for A to resume (during system resume).
      
      For this reason, represent dependencies between devices as "links",
      with the help of struct device_link objects each containing pointers
      to the "linked" devices, a list node for each of them, status
      information, flags, and an RCU head for synchronization.
      
      Also add two new list heads, representing the lists of links to the
      devices that depend on the given one (consumers) and to the devices
      depended on by it (suppliers), and a "driver presence status" field
      (needed for figuring out initial states of device links) to struct
      device.
      
      The entire data structure consisting of all of the lists of link
      objects for all devices is protected by a mutex (for link object
      addition/removal and for list walks during device driver probing
      and removal) and by SRCU (for list walking in other case that will
      be introduced by subsequent change sets).  If CONFIG_SRCU is not
      selected, however, an rwsem is used for protecting the entire data
      structure.
      
      In addition, each link object has an internal status field whose
      value reflects whether or not drivers are bound to the devices
      pointed to by the link or probing/removal of their drivers is in
      progress etc.  That field is only modified under the device links
      mutex, but it may be read outside of it in some cases (introduced by
      subsequent change sets), so modifications of it are annotated with
      WRITE_ONCE().
      
      New links are added by calling device_link_add() which takes three
      arguments: pointers to the devices in question and flags.  In
      particular, if DL_FLAG_STATELESS is set in the flags, the link status
      is not to be taken into account for this link and the driver core
      will not manage it.  In turn, if DL_FLAG_AUTOREMOVE is set in the
      flags, the driver core will remove the link automatically when the
      consumer device driver unbinds from it.
      
      One of the actions carried out by device_link_add() is to reorder
      the lists used for device shutdown and system suspend/resume to
      put the consumer device along with all of its children and all of
      its consumers (and so on, recursively) to the ends of those lists
      in order to ensure the right ordering between all of the supplier
      and consumer devices.
      
      For this reason, it is not possible to create a link between two
      devices if the would-be supplier device already depends on the
      would-be consumer device as either a direct descendant of it or a
      consumer of one of its direct descendants or one of its consumers
      and so on.
      
      There are two types of link objects, persistent and non-persistent.
      The persistent ones stay around until one of the target devices is
      deleted, while the non-persistent ones are removed automatically when
      the consumer driver unbinds from its device (ie. they are assumed to
      be valid only as long as the consumer device has a driver bound to
      it).  Persistent links are created by default and non-persistent
      links are created when the DL_FLAG_AUTOREMOVE flag is passed
      to device_link_add().
      
      Both persistent and non-persistent device links can be deleted
      with an explicit call to device_link_del().
      
      Links created without the DL_FLAG_STATELESS flag set are managed
      by the driver core using a simple state machine.  There are 5 states
      each link can be in: DORMANT (unused), AVAILABLE (the supplier driver
      is present and functional), CONSUMER_PROBE (the consumer driver is
      probing), ACTIVE (both supplier and consumer drivers are present and
      functional), and SUPPLIER_UNBIND (the supplier driver is unbinding).
      The driver core updates the link state automatically depending on
      what happens to the linked devices and for each link state specific
      actions are taken in addition to that.
      
      For example, if the supplier driver unbinds from its device, the
      driver core will also unbind the drivers of all of its consumers
      automatically under the assumption that they cannot function
      properly without the supplier.  Analogously, the driver core will
      only allow the consumer driver to bind to its device if the
      supplier driver is present and functional (ie. the link is in
      the AVAILABLE state).  If that's not the case, it will rely on
      the existing deferred probing mechanism to wait for the supplier
      driver to become available.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9ed98953
  4. 24 10月, 2016 1 次提交
  5. 22 4月, 2016 1 次提交
  6. 08 1月, 2016 1 次提交
  7. 14 10月, 2015 1 次提交
    • R
      PM / PCI / ACPI: Kick devices that might have been reset by firmware · 58a1fbbb
      Rafael J. Wysocki 提交于
      There is a concern that if the platform firmware was involved in
      the system resume that's being completed,  some devices might have
      been reset by it and if those devices had the power.direct_complete
      flag set during the preceding suspend transition, they may stay
      in a reset-power-on state indefinitely (until they are runtime-resumed
      and then suspended again).  That may not be a big deal from the
      individual device's perspective, but if the system is an SoC, it may
      be prevented from entering deep SoC-wide low-power states on idle
      because of that.
      
      The devices that are most likely to be affected by this issue are
      PCI devices and ACPI-enumerated devices using the general ACPI PM
      domain, so to prevent it from happening for those devices, force a
      runtime resume for them if they have their power.direct_complete
      flags set and the platform firmware was involved in the resume
      transition currently in progress.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      58a1fbbb
  8. 20 5月, 2015 1 次提交
    • T
      PM / Wakeirq: Add automated device wake IRQ handling · 4990d4fe
      Tony Lindgren 提交于
      Turns out we can automate the handling for the device_may_wakeup()
      quite a bit by using the kernel wakeup source list as suggested
      by Rafael J. Wysocki <rjw@rjwysocki.net>.
      
      And as some hardware has separate dedicated wake-up interrupt
      in addition to the IO interrupt, we can automate the handling by
      adding a generic threaded interrupt handler that just calls the
      device PM runtime to wake up the device.
      
      This allows dropping code from device drivers as we currently
      are doing it in multiple ways, and often wrong.
      
      For most drivers, we should be able to drop the following
      boilerplate code from runtime_suspend and runtime_resume
      functions:
      
      	...
      	device_init_wakeup(dev, true);
      	...
      	if (device_may_wakeup(dev))
      		enable_irq_wake(irq);
      	...
      	if (device_may_wakeup(dev))
      		disable_irq_wake(irq);
      	...
      	device_init_wakeup(dev, false);
      	...
      
      We can replace it with just the following init and exit
      time code:
      
      	...
      	device_init_wakeup(dev, true);
      	dev_pm_set_wake_irq(dev, irq);
      	...
      	dev_pm_clear_wake_irq(dev);
      	device_init_wakeup(dev, false);
      	...
      
      And for hardware with dedicated wake-up interrupts:
      
      	...
      	device_init_wakeup(dev, true);
      	dev_pm_set_dedicated_wake_irq(dev, irq);
      	...
      	dev_pm_clear_wake_irq(dev);
      	device_init_wakeup(dev, false);
      	...
      Signed-off-by: NTony Lindgren <tony@atomide.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      4990d4fe
  9. 13 5月, 2015 1 次提交
  10. 23 3月, 2015 1 次提交
    • R
      driver core / PM: Add PM domain callbacks for device setup/cleanup · e90d5532
      Rafael J. Wysocki 提交于
      If PM domains are in use, it may be necessary to prepare the code
      handling a PM domain for driver probing.  For example, in some
      cases device drivers rely on the ability to power on the devices
      with the help of the IO runtime PM framework and the PM domain
      code needs to be ready for that.  Also, if that code has not been
      fully initialized yet, the driver probing should be deferred.
      
      Moreover, after the probing is complete, it may be necessary to
      put the PM domain in question into the state reflecting the current
      needs of the devices in it, for example, so that power is not drawn
      in vain.  The same should be done after removing a driver from
      a device, as the PM domain state may need to be changed to reflect
      the new situation.
      
      For these reasons, introduce new PM domain callbacks, ->activate,
      ->sync and ->dismiss called, respectively, before probing for a
      device driver, after the probing has completed successfully and
      if the probing has failed or the driver has been removed.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NKevin Hilman <khilman@linaro.org>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e90d5532
  11. 04 2月, 2015 1 次提交
  12. 13 12月, 2014 1 次提交
  13. 04 12月, 2014 2 次提交
  14. 18 11月, 2014 1 次提交
  15. 01 10月, 2014 1 次提交
  16. 30 9月, 2014 1 次提交
  17. 22 9月, 2014 2 次提交
  18. 17 5月, 2014 1 次提交
    • R
      PM / sleep: Mechanism to avoid resuming runtime-suspended devices unnecessarily · aae4518b
      Rafael J. Wysocki 提交于
      Currently, some subsystems (e.g. PCI and the ACPI PM domain) have to
      resume all runtime-suspended devices during system suspend, mostly
      because those devices may need to be reprogrammed due to different
      wakeup settings for system sleep and for runtime PM.
      
      For some devices, though, it's OK to remain in runtime suspend
      throughout a complete system suspend/resume cycle (if the device was in
      runtime suspend at the start of the cycle).  We would like to do this
      whenever possible, to avoid the overhead of extra power-up and power-down
      events.
      
      However, problems may arise because the device's descendants may require
      it to be at full power at various points during the cycle.  Therefore the
      most straightforward way to do this safely is if the device and all its
      descendants can remain runtime suspended until the complete stage of
      system resume.
      
      To this end, introduce a new device PM flag, power.direct_complete
      and modify the PM core to use that flag as follows.
      
      If the ->prepare() callback of a device returns a positive number,
      the PM core will regard that as an indication that it may leave the
      device runtime-suspended.  It will then check if the system power
      transition in progress is a suspend (and not hibernation in particular)
      and if the device is, indeed, runtime-suspended.  In that case, the PM
      core will set the device's power.direct_complete flag.  Otherwise it
      will clear power.direct_complete for the device and it also will later
      clear it for the device's parent (if there's one).
      
      Next, the PM core will not invoke the ->suspend() ->suspend_late(),
      ->suspend_irq(), ->resume_irq(), ->resume_early(), or ->resume()
      callbacks for all devices having power.direct_complete set.  It
      will invoke their ->complete() callbacks, however, and those
      callbacks are then responsible for resuming the devices as
      appropriate, if necessary.  For example, in some cases they may
      need to queue up runtime resume requests for the devices using
      pm_request_resume().
      
      Changelog partly based on an Alan Stern's description of the idea
      (http://marc.info/?l=linux-pm&m=139940466625569&w=2).
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      aae4518b
  19. 20 3月, 2014 2 次提交
  20. 01 3月, 2014 2 次提交
  21. 20 2月, 2014 1 次提交
  22. 11 2月, 2014 1 次提交
    • R
      PM / QoS: Introcuce latency tolerance device PM QoS type · 2d984ad1
      Rafael J. Wysocki 提交于
      Add a new latency tolerance device PM QoS type to be use for
      specifying active state (RPM_ACTIVE) memory access (DMA) latency
      tolerance requirements for devices.  It may be used to prevent
      hardware from choosing overly aggressive energy-saving operation
      modes (causing too much latency to appear) for the whole platform.
      
      This feature reqiures hardware support, so it only will be
      available for devices having a new .set_latency_tolerance()
      callback in struct dev_pm_info populated, in which case the
      routine pointed to by it should implement whatever is necessary
      to transfer the effective requirement value to the hardware.
      
      Whenever the effective latency tolerance changes for the device,
      its .set_latency_tolerance() callback will be executed and the
      effective value will be passed to it.  If that value is negative,
      which means that the list of latency tolerance requirements for
      the device is empty, the callback is expected to switch the
      underlying hardware latency tolerance control mechanism to an
      autonomous mode if available.  If that value is PM_QOS_LATENCY_ANY,
      in turn, and the hardware supports a special "no requirement"
      setting, the callback is expected to use it.  That allows software
      to prevent the hardware from automatically updating the device's
      latency tolerance in response to its power state changes (e.g. during
      transitions from D3cold to D0), which generally may be done in the
      autonomous latency tolerance control mode.
      
      If .set_latency_tolerance() is present for the device, a new
      pm_qos_latency_tolerance_us attribute will be present in the
      devivce's power directory in sysfs.  Then, user space can use
      that attribute to specify its latency tolerance requirement for
      the device, if any.  Writing "any" to it means "no requirement, but
      do not let the hardware control latency tolerance" and writing
      "auto" to it allows the hardware to be switched to the autonomous
      mode if there are no other requirements from the kernel side in the
      device's list.
      
      This changeset includes a fix from Mika Westerberg.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      2d984ad1
  23. 22 12月, 2013 2 次提交
    • U
      PM / Runtime: Add second macro for definition of runtime PM callbacks · d9fb563d
      Ulf Hansson 提交于
      By having the runtime PM callbacks implemented for CONFIG_PM, these
      becomes available in all combinations of CONFIG_PM_SLEEP and
      CONFIG_PM_RUNTIME.
      
      The benefit using this, is that we don't need to implement the wrapper
      functions which handles runtime PM resourses, typically called from
      both runtime PM and system PM callbacks. Instead the runtime PM
      callbacks can be invoked directly from system PM callbacks, which is
      useful for some drivers, subsystems and power domains.
      
      Use the new macro SET_PM_RUNTIME_PM_OPS in cases were the above makes
      sense. Make sure the callbacks are encapsulated within CONFIG_PM
      instead of CONFIG_PM_RUNTIME.
      
      Do note that the old macro SET_RUNTIME_PM_OPS, which is being quite
      widely used right now, requires the callbacks to be defined for
      CONFIG_PM_RUNTIME. In many cases it will certainly be convenient to
      convert to the new macro above, but that will have to be distinguished
      in case by case.
      
      Cc: Kevin Hilman <khilman@linaro.org>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      d9fb563d
    • U
      PM / Sleep: Add macro to define common late/early system PM callbacks · f78c4cff
      Ulf Hansson 提交于
      We use the same approach as for the existing SET_SYSTEM_SLEEP_PM_OPS,
      but for the late and early callbacks instead.
      
      The new SET_LATE_SYSTEM_SLEEP_PM_OPS, defined for CONFIG_PM_SLEEP, will
      point ->suspend_late, ->freeze_late and ->poweroff_late to the same
      function. Vice verse happens for ->resume_early, ->thaw_early and
      ->restore_early.
      
      Cc: Kevin Hilman <khilman@linaro.org>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      f78c4cff
  24. 24 2月, 2013 1 次提交
    • M
      pm / runtime: introduce pm_runtime_set_memalloc_noio() · e823407f
      Ming Lei 提交于
      Introduce the flag memalloc_noio in 'struct dev_pm_info' to help PM core
      to teach mm not allocating memory with GFP_KERNEL flag for avoiding
      probable deadlock.
      
      As explained in the comment, any GFP_KERNEL allocation inside
      runtime_resume() or runtime_suspend() on any one of device in the path
      from one block or network device to the root device in the device tree
      may cause deadlock, the introduced pm_runtime_set_memalloc_noio() sets
      or clears the flag on device in the path recursively.
      Signed-off-by: NMing Lei <ming.lei@canonical.com>
      Cc: Minchan Kim <minchan@kernel.org>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: Oliver Neukum <oneukum@suse.de>
      Cc: Jiri Kosina <jiri.kosina@suse.com>
      Cc: Mel Gorman <mel@csn.ul.ie>
      Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
      Cc: Michal Hocko <mhocko@suse.cz>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
      Cc: Greg KH <greg@kroah.com>
      Cc: Jens Axboe <axboe@kernel.dk>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Eric Dumazet <eric.dumazet@gmail.com>
      Cc: David Decotigny <david.decotigny@google.com>
      Cc: Tom Herbert <therbert@google.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e823407f
  25. 20 2月, 2013 1 次提交
    • J
      PM: make VT switching to the suspend console optional v3 · f43f627d
      Jesse Barnes 提交于
      KMS drivers can potentially restore the display configuration without
      userspace help.  Such drivers can can call a new funciton,
      pm_vt_switch_required(false) if they support this feature.  In that
      case, the PM layer won't VT switch to the suspend console at suspend
      time and then back to the original VT on resume, but rather leave things
      alone for a nicer looking suspend and resume sequence.
      
      v2: make a function so we can handle multiple drivers (Alan)
      v3: use a list to track device requests (Rafael)
      v4: Squash in build fix from Jesse for CONFIG_VT_CONSOLE_SLEEP=n
      v5: Squash in patch from Wu Fengguang to add a few missing static
      qualifiers.
      v6: Add missing EXPORT_SYMBOL.
      Signed-off-by: NJesse Barnes <jbarnes@virtuousgeek.org>
      Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> (v3)
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      f43f627d
  26. 18 2月, 2013 1 次提交
  27. 24 10月, 2012 1 次提交
    • R
      PM / QoS: Make it possible to expose PM QoS device flags to user space · e39473d0
      Rafael J. Wysocki 提交于
      Define two device PM QoS flags, PM_QOS_FLAG_NO_POWER_OFF
      and PM_QOS_FLAG_REMOTE_WAKEUP, and introduce routines
      dev_pm_qos_expose_flags() and dev_pm_qos_hide_flags() allowing the
      caller to expose those two flags to user space or to hide them
      from it, respectively.
      
      After the flags have been exposed, user space will see two
      additional sysfs attributes, pm_qos_no_power_off and
      pm_qos_remote_wakeup, under the device's /sys/devices/.../power/
      directory.  Then, writing 1 to one of them will update the
      PM QoS flags request owned by user space so that the corresponding
      flag is requested to be set.  In turn, writing 0 to one of them
      will cause the corresponding flag in the user space's request to
      be cleared (however, the owners of the other PM QoS flags requests
      for the same device may still request the flag to be set and it
      may be effectively set even if user space doesn't request that).
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NJean Pihet <j-pihet@ti.com>
      Acked-by: Nmark gross <markgross@thegnar.org>
      e39473d0
  28. 23 10月, 2012 1 次提交
  29. 04 9月, 2012 3 次提交
    • R
      PM: Do not use the syscore flag for runtime PM · feb70af0
      Rafael J. Wysocki 提交于
      The syscore device PM flag used to mark the devices (belonging to
      PM domains) that should never be turned off, except for the system
      core (syscore) suspend/hibernation and resume stages, need not be
      accessed by the runtime PM core functions, because all of the devices
      it is set for need to be marked as "irq safe" anyway and are
      protected from being turned off by runtime PM by ensuring that their
      usage counters are always set.
      
      For this reason, make the syscore flag system-wide PM-specific
      and simplify the code used for manipulating it, because it need not
      acquire the device's power.lock any more.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      feb70af0
    • R
      PM / Domains: Move syscore flag from subsys data to struct device · dbf37414
      Rafael J. Wysocki 提交于
      The syscore device PM flag is used to mark the devices (belonging to
      a PM domain) that should never be turned off, except for the system
      core (syscore) suspend/hibernation and resume stages.  That flag is
      stored in the device's struct pm_subsys_data object whose address is
      available from struct device.  However, in some situations it may be
      convenient to set that flag before the device is added to a PM
      domain, so it is better to move it directly to the "power" member of
      struct device.  Then, it can be checked by the routines in
      drivers/base/power/runtime.c and drivers/base/power/main.c, which is
      more straightforward.
      
      This also reduces the number of dev_gpd_data() invocations in the
      generic PM domains framework, so the overhead related to the syscore
      flag is slightly smaller.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NMagnus Damm <damm@opensource.se>
      dbf37414
    • R
      PM / Runtime: Allow helpers to be called by early platform drivers · bed2b42d
      Rafael J. Wysocki 提交于
      Runtime PM helper functions, like pm_runtime_get_sync(), cannot be
      called by early platform device drivers, because the devices' power
      management locks are not initialized at that time.  This is quite
      inconvenient, so modify early_platform_add_devices() to initialize
      the devices power management locks as appropriate and make sure that
      they won't be initialized more than once if an early platform
      device is going to be used as a regular one later.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      bed2b42d
  30. 17 8月, 2012 1 次提交
  31. 02 5月, 2012 1 次提交