1. 29 5月, 2020 4 次提交
  2. 13 5月, 2020 1 次提交
  3. 13 4月, 2020 1 次提交
    • R
      opp: Manage empty OPP tables with clk handle · aca48b61
      Rajendra Nayak 提交于
      With OPP core now supporting DVFS for IO devices, we have instances of
      IO devices (same IP block) which require an OPP on some platforms/SoCs
      while just needing to scale the clock on some others.
      
      In order to avoid conditional code in every driver which supports such
      devices (to check for availability of OPPs and then deciding to do
      either dev_pm_opp_set_rate() or clk_set_rate()) add support to manage
      empty OPP tables with a clk handle.
      
      This makes dev_pm_opp_set_rate() equivalent of a clk_set_rate() for
      devices with just a clk and no OPPs specified, and makes
      dev_pm_opp_set_rate(0) bail out without throwing an error.
      Signed-off-by: NRajendra Nayak <rnayak@codeaurora.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      aca48b61
  4. 10 12月, 2019 1 次提交
    • V
      opp: Replace list_kref with a local counter · 03758d60
      Viresh Kumar 提交于
      A kref or refcount isn't the right tool to be used here for counting
      number of devices that are sharing the static OPPs created for the OPP
      table. For example, we are reinitializing the kref again, after it
      reaches a value of 0 and frees the resources, if the static OPPs get
      added for the same OPP table structure (as the OPP table structure was
      never freed). That is messy and very unclear.
      
      This patch makes parsed_static_opps an unsigned integer and uses it to
      count the number of users of the static OPPs. The increment and
      decrement to parsed_static_opps is done under opp_table->lock now to
      make sure no races are possible if the OPP table is getting added and
      removed in parallel (which doesn't happen in practice, but can in
      theory).
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      03758d60
  5. 11 11月, 2019 1 次提交
  6. 22 10月, 2019 1 次提交
  7. 21 10月, 2019 1 次提交
  8. 26 7月, 2019 5 次提交
  9. 24 6月, 2019 1 次提交
  10. 19 6月, 2019 1 次提交
  11. 17 6月, 2019 2 次提交
    • R
      opp: Make dev_pm_opp_set_rate() handle freq = 0 to drop performance votes · cd7ea582
      Rajendra Nayak 提交于
      For devices with performance state, we use dev_pm_opp_set_rate() to set
      the appropriate clk rate and the performance state.
      
      We do need a way to remove the performance state vote when we idle the
      device and turn the clocks off. Use dev_pm_opp_set_rate() with freq = 0
      to achieve this.
      Signed-off-by: NRajendra Nayak <rnayak@codeaurora.org>
      Signed-off-by: NStephen Boyd <swboyd@chromium.org>
      [ Viresh: Updated _set_required_opps() to handle the !opp case ]
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      cd7ea582
    • S
      opp: Don't overwrite rounded clk rate · b3e3759e
      Stephen Boyd 提交于
      The OPP table normally contains 'fmax' values corresponding to the
      voltage or performance levels of each OPP, but we don't necessarily want
      all the devices to run at fmax all the time. Running at fmax makes sense
      for devices like CPU/GPU, which have a finite amount of work to do and
      since a specific amount of energy is consumed at an OPP, its better to
      run at the highest possible frequency for that voltage value.
      
      On the other hand, we have IO devices which need to run at specific
      frequencies only for their proper functioning, instead of maximum
      possible frequency.
      
      The OPP core currently roundup to the next possible OPP for a frequency
      and select the fmax value. To support the IO devices by the OPP core,
      lets do the roundup to fetch the voltage or performance state values,
      but not use the OPP frequency value. Rather use the value returned by
      clk_round_rate().
      
      The current user, cpufreq, of dev_pm_opp_set_rate() already does the
      rounding to the next OPP before calling this routine and it won't
      have any side affects because of this change.
      Signed-off-by: NStephen Boyd <swboyd@chromium.org>
      Signed-off-by: NRajendra Nayak <rnayak@codeaurora.org>
      [ Viresh: Massaged changelog, added comment and use temp_opp variable
      	  instead ]
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      b3e3759e
  12. 20 5月, 2019 2 次提交
    • V
      opp: Allocate genpd_virt_devs from dev_pm_opp_attach_genpd() · c0ab9e08
      Viresh Kumar 提交于
      Currently the space for the array of virtual devices is allocated along
      with the OPP table, but that isn't going to work well from now onwards.
      For single power domain case, a driver can either use the original
      device structure for setting the performance state (if genpd attached
      with dev_pm_domain_attach()) or use the virtual device structure (if
      genpd attached with dev_pm_domain_attach_by_name(), which returns the
      virtual device) and so we can't know in advance if we are going to need
      genpd_virt_devs array or not.
      
      Lets delay the allocation a bit and do it along with
      dev_pm_opp_attach_genpd() rather. The deallocation is done from
      dev_pm_opp_detach_genpd().
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      c0ab9e08
    • V
      opp: Attach genpds to devices from within OPP core · 6319aee1
      Viresh Kumar 提交于
      The OPP core requires the virtual device pointers to set performance
      state on behalf of the device, for the multiple power domain case. The
      genpd API (dev_pm_domain_attach_by_name()) has evolved now to support
      even the single power domain case and that lets us add common code for
      handling both the cases more efficiently.
      
      The virtual device structure returned by dev_pm_domain_attach_by_name()
      isn't normally used by the cpufreq drivers as they don't manage power
      on/off of the domains and so is only useful for the OPP core.
      
      This patch moves all the complexity into the OPP core to make the end
      drivers simple. The earlier APIs dev_pm_opp_{set|put}_genpd_virt_dev()
      are reworked into dev_pm_opp_{attach|detach}_genpd(). The new helper
      dev_pm_opp_attach_genpd() accepts a NULL terminated array of strings
      which contains names of all the genpd's to attach. It then attaches all
      the domains and saves the pointers to the virtual devices. The other
      helper undo the work done by this helper.
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      6319aee1
  13. 10 4月, 2019 1 次提交
  14. 12 3月, 2019 1 次提交
  15. 07 2月, 2019 2 次提交
  16. 23 1月, 2019 1 次提交
  17. 04 1月, 2019 1 次提交
    • V
      cpufreq: scpi/scmi: Fix freeing of dynamic OPPs · 1690d8bb
      Viresh Kumar 提交于
      Since the commit 2a4eb735 "OPP: Don't remove dynamic OPPs from
      _dev_pm_opp_remove_table()", dynamically created OPP aren't
      automatically removed anymore by dev_pm_opp_cpumask_remove_table(). This
      affects the scpi and scmi cpufreq drivers which no longer free OPPs on
      failures or on invocations of the policy->exit() callback.
      
      Create a generic OPP helper dev_pm_opp_remove_all_dynamic() which can be
      called from these drivers instead of dev_pm_opp_cpumask_remove_table().
      
      In dev_pm_opp_remove_all_dynamic(), we need to make sure that the
      opp_list isn't getting accessed simultaneously from other parts of the
      OPP core while the helper is freeing dynamic OPPs, i.e. we can't drop
      the opp_table->lock while traversing through the OPP list. And to
      accomplish that, this patch also creates _opp_kref_release_unlocked()
      which can be called from this new helper with the opp_table lock already
      held.
      
      Cc: 4.20 <stable@vger.kernel.org> # v4.20
      Reported-by: NValentin Schneider <valentin.schneider@arm.com>
      Fixes: 2a4eb735 "OPP: Don't remove dynamic OPPs from _dev_pm_opp_remove_table()"
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      Tested-by: NValentin Schneider <valentin.schneider@arm.com>
      Reviewed-by: NSudeep Holla <sudeep.holla@arm.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1690d8bb
  18. 14 12月, 2018 1 次提交
    • V
      OPP: Add dev_pm_opp_xlate_performance_state() helper · c8a59103
      Viresh Kumar 提交于
      dev_pm_genpd_set_performance_state() needs to handle performance state
      propagation going forward. Currently this routine only gets the required
      performance state of the device's genpd as an argument, but it doesn't
      know how to translate that to master genpd(s) of the device's genpd.
      
      Introduce a new helper dev_pm_opp_xlate_performance_state() which will
      be used to translate from performance state of a device (or genpd
      sub-domain) to another device (or master genpd).
      
      Normally the src_table (of genpd sub-domain) will have the
      "required_opps" property set to point to one of the OPPs in the
      dst_table (of master genpd), but in some cases the genpd and its master
      have one to one mapping of performance states and so none of them have
      the "required-opps" property set. Return the performance state of the
      src_table as it is in such cases.
      Tested-by: NRajendra Nayak <rnayak@codeaurora.org>
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      c8a59103
  19. 11 12月, 2018 2 次提交
    • V
      OPP: Fix missing debugfs supply directory for OPPs · 46f48aca
      Viresh Kumar 提交于
      There is one case where we may end up with no "supply" directory for the
      OPPs in debugfs. That happens when the OPP core isn't managing the
      regulators for the device and the device's OPP do have microvolt
      property. It happens because the opp_table->regulator_count remains set
      to 0 and the debugfs routines don't add any supply directory in such a
      case.
      
      This commit fixes that by setting opp_table->regulator_count to 1 in
      that particular case. But to make everything work nicely and not break
      other parts of the core, regulator_count is defined as "int" now instead
      of "unsigned int" and it can have different special values now. It is
      set to -1 initially to mark it "uninitialized" and later only we set it
      to 0 or positive values after checking how many supplies are there.
      
      This also helps in finding the bugs where only few of the OPPs have the
      "opp-microvolt" property set and not all.
      
      Fixes: 1fae788e ("PM / OPP: Don't create debugfs "supply-0" directory unnecessarily")
      Reported-by: NQuentin Perret <quentin.perret@arm.com>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      46f48aca
    • V
      OPP: Use opp_table->regulators to verify no regulator case · 90e3577b
      Viresh Kumar 提交于
      The value of opp_table->regulator_count is not very consistent right now
      and it may end up being 0 while we do have a "opp-microvolt" property in
      the OPP table. It was kept that way as we used to check if any
      regulators are set with the OPP core for a device or not using value of
      regulator_count.
      
      Lets use opp_table->regulators for that purpose as the meaning of
      regulator_count is going to change in the later patches.
      Reported-by: NQuentin Perret <quentin.perret@arm.com>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      90e3577b
  20. 05 11月, 2018 5 次提交
    • V
      OPP: Configure all required OPPs · ca1b5d77
      Viresh Kumar 提交于
      Now that all the infrastructure is in place to support multiple required
      OPPs, lets switch over to using it.
      
      A new internal routine _set_required_opps() takes care of updating
      performance state for all the required OPPs. With this the performance
      state updates are supported even when the end device needs to configure
      regulators as well, that wasn't the case earlier.
      
      The pstates were earlier stored in the end device's OPP structures, that
      also changes now as those values are stored in the genpd's OPP
      structures. And so we switch over to using
      pm_genpd_opp_to_performance_state() instead of
      of_genpd_opp_to_performance_state() to get performance state for the
      genpd OPPs.
      
      The routine _generic_set_opp_domain() is not required anymore and is
      removed.
      
      On errors we don't try to recover by reverting to old settings as things
      are really complex now and the calls here should never really fail
      unless there is a bug. There is no point increasing the complexity, for
      code which will never be executed.
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      ca1b5d77
    • V
      OPP: Add dev_pm_opp_{set|put}_genpd_virt_dev() helper · 4f018bc0
      Viresh Kumar 提交于
      Multiple generic power domains for a consumer device are supported with
      the help of virtual devices, which are created for each consumer device
      - genpd pair. These are the device structures which are attached to the
      power domain and are required by the OPP core to set the performance
      state of the genpd.
      
      The helpers added by this commit are required to be called once for each
      of these virtual devices. These are required only if multiple domains
      are available for a device, otherwise the actual device structure will
      be used instead by the OPP core.
      
      The new helpers also support the complex cases where the consumer device
      wouldn't always require all the domains. For example, a camera may
      require only one power domain during normal operations but two during
      high resolution operations. The consumer driver can call
      dev_pm_opp_put_genpd_virt_dev(high_resolution_genpd_virt_dev) if it is
      currently operating in the normal mode and doesn't have any performance
      requirements from the genpd which manages high resolution power
      requirements. The consumer driver can later call
      dev_pm_opp_set_genpd_virt_dev(high_resolution_genpd_virt_dev) once it
      switches back to the high resolution mode.
      
      The new helpers differ from other OPP set/put helpers as the new ones
      can be called with OPPs initialized for the table as we may need to call
      them on the fly because of the complex case explained above. For this
      reason it is possible that the genpd virt_dev structure may be used in
      parallel while the new helpers are running and a new mutex is added to
      protect against that. We didn't use the existing opp_table->lock mutex
      as that is widely used in the OPP core and we will need this lock in the
      dev_pm_opp_set_rate() helper while changing OPP and we need to make sure
      there is not much contention while doing that as that's the hotpath.
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      4f018bc0
    • V
      OPP: Populate OPPs from "required-opps" property · da544b61
      Viresh Kumar 提交于
      An earlier commit populated the OPP tables from the "required-opps"
      property, this commit populates the individual OPPs. This is repeated
      for each OPP in the OPP table and these populated OPPs will be used by
      later commits.
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      da544b61
    • V
      OPP: Populate required opp tables from "required-opps" property · 5d6d106f
      Viresh Kumar 提交于
      The current implementation works only for the case where a single
      phandle is present in the "required-opps" property, while DT allows
      multiple phandles to be present there.
      
      This patch adds new infrastructure to parse all the phandles present in
      "required-opps" property and save pointers of the required OPP's OPP
      tables. These will be used by later commits.
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      5d6d106f
    • V
      OPP: Separate out custom OPP handler specific code · 7e535993
      Viresh Kumar 提交于
      Create a separate routine to take care of custom set_opp() handler
      specific stuff.
      Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      7e535993
  21. 04 10月, 2018 1 次提交
  22. 01 10月, 2018 1 次提交
    • V
      OPP: Prevent creating multiple OPP tables for devices sharing OPP nodes · 283d55e6
      Viresh Kumar 提交于
      When two or more devices are sharing their clock and voltage rails, they
      share the same OPP table. But there are some corner cases where the OPP
      core incorrectly creates separate OPP tables for them.
      
      For example, CPU 0 and 1 share clock/voltage rails. The platform
      specific code calls dev_pm_opp_set_regulators() for CPU0 and the OPP
      core creates an OPP table for it (the individual OPPs aren't initialized
      as of now). The same is repeated for CPU1 then. Because
      _opp_get_opp_table() doesn't compare DT node pointers currently, it
      fails to find the link between CPU0 and CPU1 and so creates a new OPP
      table.
      
      Fix this by calling _managed_opp() from _opp_get_opp_table().
      _managed_opp() gain an additional argument (index) to get the right node
      pointer. This resulted in simplifying code in _of_add_opp_table_v2() as
      well.
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      283d55e6
  23. 20 9月, 2018 3 次提交
    • V
      OPP: Use a single mechanism to free the OPP table · cdd6ed90
      Viresh Kumar 提交于
      Currently there are two separate ways to free the OPP table based on how
      it is created in the first place.
      
      We call _dev_pm_opp_remove_table() to free the static and/or dynamic
      OPP, OPP list devices, etc. This is done for the case where the OPP
      table is added while initializing the OPPs, like via the path
      dev_pm_opp_of_add_table().
      
      We also call dev_pm_opp_put_opp_table() in some cases which eventually
      frees the OPP table structure once the reference count reaches 0. This
      is used by the first case as well as other cases like
      dev_pm_opp_set_regulators() where the OPPs aren't necessarily
      initialized at this point.
      
      This whole thing is a bit unclear and messy and obstruct any further
      cleanup/fixup of OPP core.
      
      This patch tries to streamline this by keeping a single path for OPP
      table destruction, i.e. dev_pm_opp_put_opp_table().
      
      All the cleanup happens in _opp_table_kref_release() now after the
      reference count reaches 0. _dev_pm_opp_remove_table() is removed as it
      isn't required anymore.
      
      We don't drop the reference to the OPP table after creating it from
      _of_add_opp_table_v{1|2}() anymore and the same is dropped only when we
      try to remove them.
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      cdd6ed90
    • V
      OPP: Don't remove dynamic OPPs from _dev_pm_opp_remove_table() · 2a4eb735
      Viresh Kumar 提交于
      Only one platform was depending on this feature and it is already
      updated now. Stop removing dynamic OPPs from _dev_pm_opp_remove_table().
      This simplifies lot of paths and removes unnecessary parameters.
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      2a4eb735
    • V
      OPP: Create separate kref for static OPPs list · d0e8ae6c
      Viresh Kumar 提交于
      The static OPPs don't always get freed with the OPP table, it can happen
      before that as well. For example, if the OPP table is first created
      using helpers like dev_pm_opp_set_supported_hw() and the OPPs are
      created at a later point. Now when the OPPs are removed, the OPP table
      stays until the time dev_pm_opp_put_supported_hw() is called.
      
      Later patches will streamline the freeing of OPP table and that requires
      the static OPPs to get freed with help of a separate kernel reference.
      This patch prepares for that by creating a separate kref for static OPPs
      list.
      Tested-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
      d0e8ae6c