1. 22 10月, 2016 4 次提交
  2. 13 9月, 2016 6 次提交
    • J
      PM / Domains: Add support for removing nested PM domains by provider · 17926551
      Jon Hunter 提交于
      If a device supports PM domains that are subdomains of another PM
      domain, then the PM domains should be removed in reverse order to
      ensure that the subdomains are removed first. Furthermore, if there is
      more than one provider, then there needs to be a way to remove the
      domains in reverse order for a specific provider.
      
      Add the function of_genpd_remove_last() to remove the last PM domain
      added by a given PM domain provider and return the generic_pm_domain
      structure for the PM domain that was removed.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      17926551
    • J
      PM / Domains: Add support for removing PM domains · 3fe57710
      Jon Hunter 提交于
      The genpd framework allows users to add PM domains via the pm_genpd_init()
      function, however, there is no corresponding function to remove a PM
      domain. For most devices this may be fine as the PM domains are never
      removed, however, for devices that wish to populate the PM domains from
      within a driver, having the ability to remove a PM domain if the probing
      of the device fails or the driver is unloaded is necessary.
      
      Add the function pm_genpd_remove() to remove a PM domain by referencing
      it's generic_pm_domain structure. Note that the bulk of the code that
      removes the PM domain is placed in a separate local function
      genpd_remove() (which is called by pm_genpd_remove()). The code is
      structured in this way to prepare for adding another function to remove
      a PM domain by provider that will also call genpd_remove(). Note that
      users of genpd_remove() must call this function with the mutex,
      gpd_list_lock, held.
      
      PM domains can only be removed if the associated provider has been
      removed, they are not a parent domain to another PM domain and have no
      devices associated with them.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      3fe57710
    • J
      PM / Domains: Store the provider in the PM domain structure · de0aa06d
      Jon Hunter 提交于
      It is possible that a device has more than one provider of PM domains
      and to support the removal of a PM domain by provider, it is necessary
      to store a reference to the provider in the PM domain structure.
      Therefore, store a reference to the firmware node handle in the PM
      domain structure and populate it when providers (only device-tree based
      providers are currently supported by PM domains) are registered.
      
      Please note that when removing PM domains, it is necessary to verify
      that the PM domain provider has been removed from the list of providers
      before the PM domain can be removed. To do this add another member to
      the PM domain structure that indicates if the provider is present and
      set this member accordingly when providers are added and removed.
      
      Initialise the 'provider' and 'has_provider' members of the
      generic_pm_domain structure when a PM domains is added by calling
      pm_genpd_init().
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      de0aa06d
    • J
      PM / Domains: Don't expose xlate and provider helper functions · 892ebdcc
      Jon Hunter 提交于
      Functions __of_genpd_xlate_simple(), __of_genpd_xlate_onecell() and
      __of_genpd_add_provider() are not used outside of the core generic PM
      domain code. Therefore, reduce the number of APIs exposed by making
      these static. At the same time don't expose the typedef for
      genpd_xlate_t either and make this a local definition as well.
      
      The functions are renamed to follow the naming conventions for static
      functions in the generic PM domain core.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      892ebdcc
    • J
      PM / Domains: Don't expose generic_pm_domain structure to clients · f58d4e5a
      Jon Hunter 提交于
      There should be no need to expose the generic_pm_domain structure to
      clients and this eliminates the need to implement reference counting for
      any external reference to a PM domain. Therefore, make the functions
      pm_genpd_lookup_dev() and of_genpd_get_from_provider() private to the
      PM domain core. The functions are renamed in accordance with the naming
      conventions for genpd static functions.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      f58d4e5a
    • J
      PM / Domains: Add new helper functions for device-tree · ec69572b
      Jon Hunter 提交于
      Ideally, if we are returning a reference to a PM domain via a call to
      of_genpd_get_from_provider(), then we should keep track of such
      references via a reference count. The reference count could then be used
      to determine if a PM domain can be safely removed. Alternatively, it is
      possible to avoid such external references by providing APIs to access
      the PM domain and hence, eliminate any calls to
      of_genpd_get_from_provider().
      
      Add new helper functions for adding a device and a subdomain to a PM
      domain when using device-tree, so that external calls to
      of_genpd_get_from_provider() can be removed.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      ec69572b
  3. 29 6月, 2016 1 次提交
  4. 16 6月, 2016 1 次提交
    • U
      PM / Domains: Allow genpd to power on during system PM phases · 39dd0f23
      Ulf Hansson 提交于
      If a PM domain is powered off when the first device starts its system PM
      prepare phase, genpd prevents any further attempts to power on the PM
      domain during the following system PM phases. Not until the system PM
      complete phase is finalized for all devices in the PM domain, genpd again
      allows it to be powered on.
      
      This behaviour needs to be changed, as a subsystem/driver for a device in
      the same PM domain may still need to be able to serve requests in some of
      the system PM phases. Accordingly, it may need to runtime resume its
      device and thus also request the corresponding PM domain to be powered on.
      
      To deal with these scenarios, let's make the device operational in the
      system PM prepare phase by runtime resuming it, no matter if the PM domain
      is powered on or off. Changing this also enables us to remove genpd's
      suspend_power_off flag, as it's being used to track this condition.
      Additionally, we must allow the PM domain to be powered on via runtime PM
      during the system PM phases.
      
      This change also requires a fix in the AMD ACP (Audio CoProcessor) drm
      driver. It registers a genpd to model the ACP as a PM domain, but
      unfortunately it's also abuses genpd's "internal" suspend_power_off flag
      to deal with a corner case at system PM resume.
      
      More precisely, the so called SMU block powers on the ACP at system PM
      resume, unconditionally if it's being used or not. This may lead to that
      genpd's internal status of the power state, may not correctly reflect the
      power state of the HW after a system PM resume.
      
      Because of changing the behaviour of genpd, by runtime resuming devices in
      the prepare phase, the AMD ACP drm driver no longer have to deal with this
      corner case. So let's just drop the related code in this driver.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NKevin Hilman <khilman@baylibre.com>
      Acked-by: NMaruthi Bayyavarapu <maruthi.bayyavarapu@amd.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      39dd0f23
  5. 22 4月, 2016 2 次提交
  6. 16 2月, 2016 2 次提交
    • A
      PM / Domains: remove old power on/off latencies · 90e63452
      Axel Haslam 提交于
      Now that all known users have been converted to use state latencies,
      we can remove the latency field in the generic_pm_domain structure.
      Signed-off-by: NAxel Haslam <ahaslam+renesas@baylibre.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      90e63452
    • A
      PM / Domains: Support for multiple states · fc5cbf0c
      Axel Haslam 提交于
      Some hardware (eg. OMAP), has the ability to enter different low power
      modes for a given power domain. This allows for more fine grained control
      over the power state of the platform. As a typical example, some registers
      of the hardware may be implemented with retention flip-flops and be able
      to retain their state at lower voltages allowing for faster on/off
      latencies and an increased window of opportunity to enter an intermediate
      low power state other than "off"
      
      When trying to set a power domain to off, the genpd governor will choose
      the deepest state that will respect the qos constraints of all the devices
      and sub-domains on the power domain. The state chosen by the governor is
      saved in the "state_idx" field of the generic_pm_domain structure and
      shall be used by the power_off and power_on callbacks to perform the
      necessary actions to set the power domain into (and out of) the state
      indicated by state_idx.
      
      States must be declared in ascending order from shallowest to deepest,
      deepest meaning the state which takes longer to enter and exit.
      
      For platforms that don't declare any states, a single a single "off"
      state is used. Once all platforms are converted to use the state array,
      the legacy on/off latencies will be removed.
      
      [ Lina: Modified genpd state initialization and remove use of
              save_state_latency_ns in genpd timing data ]
      Suggested-by: NKevin Hilman <khilman@linaro.org>
      Signed-off-by: NLina Iyer <lina.iyer@linaro.org>
      Signed-off-by: NAxel Haslam <ahaslam+renesas@baylibre.com>
      Acked-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      fc5cbf0c
  7. 08 1月, 2016 1 次提交
  8. 28 10月, 2015 1 次提交
  9. 13 10月, 2015 3 次提交
  10. 26 9月, 2015 2 次提交
  11. 29 8月, 2015 1 次提交
  12. 01 8月, 2015 1 次提交
    • U
      PM / Domains: Remove intermediate states from the power off sequence · ba2bbfbf
      Ulf Hansson 提交于
      Genpd's ->runtime_suspend() (assigned to pm_genpd_runtime_suspend())
      doesn't immediately walk the hierarchy of ->runtime_suspend() callbacks.
      Instead, pm_genpd_runtime_suspend() calls pm_genpd_poweroff() which
      postpones that until *all* the devices in the genpd are runtime suspended.
      
      When pm_genpd_poweroff() discovers that the last device in the genpd is
      about to be runtime suspended, it calls __pm_genpd_save_device() for *all*
      the devices in the genpd sequentially. Furthermore,
      __pm_genpd_save_device() invokes the ->start() callback, walks the
      hierarchy of the ->runtime_suspend() callbacks and invokes the ->stop()
      callback. This causes a "thundering herd" problem.
      
      Let's address this issue by having pm_genpd_runtime_suspend() immediately
      walk the hierarchy of the ->runtime_suspend() callbacks, instead of
      postponing that to the power off sequence via pm_genpd_poweroff(). If the
      selected ->runtime_suspend() callback doesn't return an error code, call
      pm_genpd_poweroff() to see if it's feasible to also power off the PM
      domain.
      
      Adopting this change enables us to simplify parts of the code in genpd,
      for example the locking mechanism. Additionally, it gives some positive
      side effects, as described below.
      
      i)
      One device's ->runtime_resume() latency is no longer affected by other
      devices' latencies in a genpd.
      
      The complexity genpd has to support the option to abort the power off
      sequence suffers from latency issues. More precisely, a device that is
      requested to be runtime resumed, may end up waiting for
      __pm_genpd_save_device() to complete its operations for *another* device.
      That's because pm_genpd_poweroff() can't confirm an abort request while it
      waits for __pm_genpd_save_device() to return.
      
      As this patch removes the intermediate states in pm_genpd_poweroff() while
      powering off the PM domain, we no longer need the ability to abort that
      sequence.
      
      ii)
      Make pm_runtime[_status]_suspended() reliable when used with genpd.
      
      Until the last device in a genpd becomes idle, pm_genpd_runtime_suspend()
      will return 0 without actually walking the hierarchy of the
      ->runtime_suspend() callbacks. However, by returning 0 the runtime PM core
      considers the device as runtime_suspended, so
      pm_runtime[_status]_suspended() will return true, even though the device
      isn't (yet) runtime suspended.
      
      After this patch, since pm_genpd_runtime_suspend() immediately walks the
      hierarchy of the ->runtime_suspend() callbacks,
      pm_runtime[_status]_suspended() will accurately reflect the status of the
      device.
      
      iii)
      Enable fine-grained PM through runtime PM callbacks in drivers/subsystems.
      
      There are currently cases were drivers/subsystems implements runtime PM
      callbacks to deploy fine-grained PM (e.g. gate clocks, move pinctrl to
      power-save state, etc.). While using the genpd, pm_genpd_runtime_suspend()
      postpones invoking these callbacks until *all* the devices in the genpd
      are runtime suspended. In essence, one runtime resumed device prevents
      fine-grained PM for other devices within the same genpd.
      
      After this patch, since pm_genpd_runtime_suspend() immediately walks the
      hierarchy of the ->runtime_suspend() callbacks, fine-grained PM is enabled
      throughout all the levels of runtime PM callbacks.
      
      iiii)
      Enable fine-grained PM for IRQ safe devices
      
      Per the definition for an IRQ safe device, its runtime PM callbacks must
      be able to execute in atomic context. In the path while genpd walks the
      hierarchy of the ->runtime_suspend() callbacks for the device, it uses a
      mutex. Therefore, genpd prevents that path to be executed for IRQ safe
      devices.
      
      As this patch changes pm_genpd_runtime_suspend() to immediately walk the
      hierarchy of the ->runtime_suspend() callbacks and without needing to use
      a mutex, fine-grained PM is enabled throughout all the levels of runtime
      PM callbacks for IRQ safe devices.
      
      Unfortunately this patch also comes with a drawback, as described in the
      summary below.
      
      Driver's/subsystem's runtime PM callbacks may be invoked even when the
      genpd hasn't actually powered off the PM domain, potentially introducing
      unnecessary latency.
      
      However, in most cases, saving/restoring register contexts for devices are
      typically fast operations or can be optimized in device specific ways
      (e.g. shadow copies of register contents in memory, device-specific checks
      to see if context has been lost before restoring context, etc.).
      
      Still, in some cases the driver/subsystem may suffer from latency if
      runtime PM is used in a very fine-grained manner (e.g. for each IO request
      or xfer). To prevent that extra overhead, the driver/subsystem may deploy
      the runtime PM autosuspend feature.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NKevin Hilman <khilman@linaro.org>
      Tested-by: NGeert Uytterhoeven <geert+renesas@glider.be>
      Tested-by: NLina Iyer <lina.iyer@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      ba2bbfbf
  13. 23 3月, 2015 1 次提交
  14. 04 2月, 2015 2 次提交
  15. 24 1月, 2015 1 次提交
  16. 17 12月, 2014 1 次提交
  17. 04 12月, 2014 2 次提交
  18. 18 11月, 2014 1 次提交
  19. 12 11月, 2014 1 次提交
    • U
      PM / Domains: Fix initial default state of the need_restore flag · 67732cd3
      Ulf Hansson 提交于
      The initial state of the device's need_restore flag should'nt depend on
      the current state of the PM domain. For example it should be perfectly
      valid to attach an inactive device to a powered PM domain.
      
      The pm_genpd_dev_need_restore() API allow us to update the need_restore
      flag to somewhat cope with such scenarios. Typically that should have
      been done from drivers/buses ->probe() since it's those that put the
      requirements on the value of the need_restore flag.
      
      Until recently, the Exynos SOCs were the only user of the
      pm_genpd_dev_need_restore() API, though invoking it from a centralized
      location while adding devices to their PM domains.
      
      Due to that Exynos now have swithed to the generic OF-based PM domain
      look-up, it's no longer possible to invoke the API from a centralized
      location. The reason is because devices are now added to their PM
      domains during the probe sequence.
      
      Commit "ARM: exynos: Move to generic PM domain DT bindings"
      did the switch for Exynos to the generic OF-based PM domain look-up,
      but it also removed the call to pm_genpd_dev_need_restore(). This
      caused a regression for some of the Exynos drivers.
      
      To handle things more properly in the generic PM domain, let's change
      the default initial value of the need_restore flag to reflect that the
      state is unknown. As soon as some of the runtime PM callbacks gets
      invoked, update the initial value accordingly.
      
      Moreover, since the generic PM domain is verifying that all devices
      are both runtime PM enabled and suspended, using pm_runtime_suspended()
      while pm_genpd_poweroff() is invoked from the scheduled work, we can be
      sure of that the PM domain won't be powering off while having active
      devices.
      
      Do note that, the generic PM domain can still only know about active
      devices which has been activated through invoking its runtime PM resume
      callback. In other words, buses/drivers using pm_runtime_set_active()
      during ->probe() will still suffer from a race condition, potentially
      probing a device without having its PM domain being powered. That issue
      will have to be solved using a different approach.
      
      This a log from the boot regression for Exynos5, which is being fixed in
      this patch.
      
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 308 at ../drivers/clk/clk.c:851 clk_disable+0x24/0x30()
      Modules linked in:
      CPU: 0 PID: 308 Comm: kworker/0:1 Not tainted 3.18.0-rc3-00569-gbd9449f-dirty #10
      Workqueue: pm pm_runtime_work
      [<c0013c64>] (unwind_backtrace) from [<c0010dec>] (show_stack+0x10/0x14)
      [<c0010dec>] (show_stack) from [<c03ee4cc>] (dump_stack+0x70/0xbc)
      [<c03ee4cc>] (dump_stack) from [<c0020d34>] (warn_slowpath_common+0x64/0x88)
      [<c0020d34>] (warn_slowpath_common) from [<c0020d74>] (warn_slowpath_null+0x1c/0x24)
      [<c0020d74>] (warn_slowpath_null) from [<c03107b0>] (clk_disable+0x24/0x30)
      [<c03107b0>] (clk_disable) from [<c02cc834>] (gsc_runtime_suspend+0x128/0x160)
      [<c02cc834>] (gsc_runtime_suspend) from [<c0249024>] (pm_generic_runtime_suspend+0x2c/0x38)
      [<c0249024>] (pm_generic_runtime_suspend) from [<c024f44c>] (pm_genpd_default_save_state+0x2c/0x8c)
      [<c024f44c>] (pm_genpd_default_save_state) from [<c024ff2c>] (pm_genpd_poweroff+0x224/0x3ec)
      [<c024ff2c>] (pm_genpd_poweroff) from [<c02501b4>] (pm_genpd_runtime_suspend+0x9c/0xcc)
      [<c02501b4>] (pm_genpd_runtime_suspend) from [<c024a4f8>] (__rpm_callback+0x2c/0x60)
      [<c024a4f8>] (__rpm_callback) from [<c024a54c>] (rpm_callback+0x20/0x74)
      [<c024a54c>] (rpm_callback) from [<c024a930>] (rpm_suspend+0xd4/0x43c)
      [<c024a930>] (rpm_suspend) from [<c024bbcc>] (pm_runtime_work+0x80/0x90)
      [<c024bbcc>] (pm_runtime_work) from [<c0032a9c>] (process_one_work+0x12c/0x314)
      [<c0032a9c>] (process_one_work) from [<c0032cf4>] (worker_thread+0x3c/0x4b0)
      [<c0032cf4>] (worker_thread) from [<c003747c>] (kthread+0xcc/0xe8)
      [<c003747c>] (kthread) from [<c000e738>] (ret_from_fork+0x14/0x3c)
      ---[ end trace 40cd58bcd6988f12 ]---
      
      Fixes: a4a8c2c4 (ARM: exynos: Move to generic PM domain DT bindings)
      Reported-and-tested0by: Sylwester Nawrocki <s.nawrocki@samsung.com>
      Reviewed-by: NSylwester Nawrocki <s.nawrocki@samsung.com>
      Reviewed-by: NKevin Hilman <khilman@linaro.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      67732cd3
  20. 08 11月, 2014 1 次提交
  21. 03 10月, 2014 1 次提交
  22. 30 9月, 2014 1 次提交
  23. 26 9月, 2014 2 次提交
  24. 22 9月, 2014 1 次提交