17 Aug, 2022

1 commit

  • [ Upstream commit 4ea9496cbc959eb5c78f3e379199aca9ef4e386b ]

    dev_pm_domain_attach_by_name() may return NULL in some cases,
    so IS_ERR() doesn't meet the requirements. Thus fix it.

    Fixes: 6319aee10e53 ("opp: Attach genpds to devices from within OPP core")
    Signed-off-by: Tang Bin
    [ Viresh: Replace ENODATA with ENODEV ]
    Signed-off-by: Viresh Kumar
    Signed-off-by: Sasha Levin

    Tang Bin
     

09 Jun, 2022

1 commit


14 Apr, 2022

1 commit

  • [ Upstream commit 021dbecabc93b1610b5db989d52a94e0c6671136 ]

    It is difficult to find which OPPs are active at the moment, specially
    if there are multiple OPPs with same frequency available in the device
    tree (controlled by supported hardware feature).

    Expose name of the DT node to find out the exact OPP.

    While at it, also expose level field.

    Reported-by: Leo Yan
    Tested-by: Leo Yan
    Signed-off-by: Viresh Kumar
    Signed-off-by: Sasha Levin

    Viresh Kumar
     

19 Nov, 2021

1 commit

  • [ Upstream commit 27ff8187f13ecfec8a26fb1928e906f46f326cc5 ]

    Fix sparse warning:
    drivers/opp/of.c:924 _opp_add_static_v2() warn: passing zero to 'ERR_PTR'

    For duplicate OPPs 'ret' be set to zero.

    Fixes: deac8703da5f ("PM / OPP: _of_add_opp_table_v2(): increment count only if OPP is added")
    Signed-off-by: YueHaibing
    Signed-off-by: Viresh Kumar
    Signed-off-by: Sasha Levin

    YueHaibing
     

31 Aug, 2021

2 commits

  • * pm-pci:
    PCI: PM: Enable PME if it can be signaled from D3cold
    PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently
    PCI: Use pci_update_current_state() in pci_enable_device_flags()

    * pm-sleep:
    PM: sleep: unmark 'state' functions as kernel-doc
    PM: sleep: check RTC features instead of ops in suspend_test
    PM: sleep: s2idle: Replace deprecated CPU-hotplug functions

    * pm-domains:
    PM: domains: Fix domain attach for CONFIG_PM_OPP=n
    arm64: dts: sc7180: Add required-opps for i2c
    PM: domains: Add support for 'required-opps' to set default perf state
    opp: Don't print an error if required-opps is missing

    * powercap:
    powercap: Add Power Limit4 support for Alder Lake SoC
    powercap: intel_rapl: Replace deprecated CPU-hotplug functions

    Rafael J. Wysocki
     
  • Rafael J. Wysocki
     

23 Aug, 2021

1 commit

  • Commit 4fa82a87ba55 ("opp: Allow required-opps to be used for non genpd
    use cases") dereferences the pointers in required_opp_tables but these
    might be set to an ERR_PTR if the list still has lazy links pending,
    resulting in segfaults. Prior to this patch IS_ERR was also checked on
    required_opp_tables[i] before reading ->is_genpd inside
    _opp_table_alloc_required_tables, which is at the same time the
    predicate to add this table to the lazy list. This segfault is solved
    by reordering the checks to bail on lazy pending tables before reading
    ->is_genpd.

    Fixes: 4fa82a87ba55 ("opp: Allow required-opps to be used for non genpd use cases")
    Reviewed-by: AngeloGioacchino Del Regno
    Signed-off-by: Marijn Suijten
    Signed-off-by: Viresh Kumar

    Marijn Suijten
     

17 Aug, 2021

1 commit

  • The 'required-opps' property is considered optional, hence remove
    the pr_err() in of_parse_required_opp() when we find the property is
    missing.
    While at it, also fix the return value of
    of_get_required_opp_performance_state() when of_parse_required_opp()
    fails, return a -ENODEV instead of the -EINVAL.

    Signed-off-by: Rajendra Nayak
    Reviewed-by: Ulf Hansson
    Acked-by: Viresh Kumar
    Signed-off-by: Rafael J. Wysocki

    Rajendra Nayak
     

16 Aug, 2021

1 commit

  • The current_opp is released only when whole OPP table is released,
    otherwise it's only marked as removed by dev_pm_opp_remove_table().
    Functions like dev_pm_opp_put_clkname() and dev_pm_opp_put_supported_hw()
    are checking whether OPP table is empty and it's not if current_opp is
    set since it holds the refcount of OPP, this produces a noisy warning
    from these functions about busy OPP table. Remove the checks to fix it.

    Cc: stable@vger.kernel.org
    Fixes: 81c4d8a3c414 ("opp: Keep track of currently programmed OPP")
    Signed-off-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko
     

04 Aug, 2021

1 commit


18 Jun, 2021

1 commit

  • Don't limit required_opp_table to genpd only. One possible use case is
    cpufreq based devfreq governor, which can use required-opps property to
    derive devfreq from cpufreq.

    Though the OPP core still doesn't support non-genpd required-opps in
    _set_required_opps().

    Suggested-by: Chanwoo Choi
    Signed-off-by: Hsin-Yi Wang
    [ Viresh: Update _set_required_opps() to check for genpd ]
    Signed-off-by: Viresh Kumar

    Hsin-Yi Wang
     

20 May, 2021

1 commit


16 Mar, 2021

2 commits


15 Mar, 2021

4 commits


12 Mar, 2021

1 commit

  • We are required to call dev_pm_opp_put() from outside of the
    opp_table->lock as debugfs removal needs to happen lock-less to avoid
    circular dependency issues.

    commit cf1fac943c63 ("opp: Reduce the size of critical section in
    _opp_kref_release()") tried to fix that introducing a new routine
    _opp_get_next() which keeps returning OPPs that can be freed by the
    callers and this routine shall be called without holding the
    opp_table->lock.

    Though the commit overlooked the fact that the OPPs can be referenced by
    other users as well and this routine will end up dropping references
    which were taken by other users and hence freeing the OPPs prematurely.

    In effect, other users of the OPPs will end up having invalid pointers
    at hand. We didn't see any crash reports earlier as the exact situation
    never happened, though it is certainly possible.

    We need a way to mark which OPPs are no longer referenced by the OPP
    core, so we don't drop extra references to them accidentally.

    This commit adds another OPP flag, "removed", which is used to track
    this. And now we should never end up dropping extra references to the
    OPPs.

    Cc: v5.11+ # v5.11+
    Fixes: cf1fac943c63 ("opp: Reduce the size of critical section in _opp_kref_release()")
    Signed-off-by: Beata Michalska
    [ Viresh: Almost rewrote entire patch, added new "removed" field,
    rewrote commit log and added the correct Fixes tag. ]
    Co-developed-by: Viresh Kumar
    Signed-off-by: Viresh Kumar

    Beata Michalska
     

18 Feb, 2021

1 commit

  • We skip the OPP update if the current and target OPPs are same. This is
    fine for the devices that don't support frequency but may cause issues
    for the ones that need to program frequency.

    An OPP entry doesn't really signify a single operating frequency but
    rather the highest frequency at which the other properties of the OPP
    entry apply. And we may reach here with different frequency values,
    while all of them would point to the same OPP entry in the OPP table.

    We just need to update the clock frequency in that case, though in order
    to not add special exit points we reuse the code flow from a normal
    path.

    While at it, rearrange the conditionals in the 'if' statement to check
    'enabled' flag at the end.

    Fixes: 81c4d8a3c414 ("opp: Keep track of currently programmed OPP")
    Signed-off-by: Jonathan Marek
    [ Viresh: Improved commit log and subject, rename current_freq as
    current_rate, document it, remove local variable and rearrange
    code. ]
    Signed-off-by: Viresh Kumar

    Jonathan Marek
     

04 Feb, 2021

1 commit


02 Feb, 2021

19 commits

  • Not all devices that need to use OPP core need to have clocks, a missing
    clock is fine in which case -ENOENT shall be returned by clk_get().

    Anything else is an error and must be handled properly.

    Reported-by: Dmitry Osipenko
    Tested-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The bandwidth must be scaled at a different point in the code flow based
    on if we are scaling up or down the frequency, otherwise this may cause
    undesired effects as the device will try to use more of the memory
    bandwidth which may be shared across several devices. Much like how
    regulators and required-opps are programmed.

    Reported-by: Dmitry Osipenko
    Reported-by: Akhil P Oommen
    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The OPP core currently requires the required opp tables to be available
    before the dependent OPP table is added, as it needs to create links
    from the dependent OPP table to the required ones. This may not be
    convenient for all the platforms though, as this requires strict
    ordering for probing the drivers.

    This patch allows lazy-linking of the required-opps. The OPP tables for
    which the required-opp-tables aren't available at the time of their
    initialization, are added to a special list of OPP tables:
    lazy_opp_tables. Later on, whenever a new OPP table is registered with
    the OPP core, we check if it is required by an OPP table in the pending
    list; if yes, then we complete the linking then and there.

    An OPP table is marked unusable until the time all its required-opp
    tables are available. And if lazy-linking fails for an OPP table, the
    OPP core disables all of its OPPs to make sure no one can use them.

    Tested-by: Hsin-Yi Wang
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • All the users have migrated to dev_pm_opp_set_opp() now, get rid of the
    duplicate API, dev_pm_opp_set_bw(), which only performs a part of the new API.

    While at it, remove the unnecessary parameter to _set_opp_bw().

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The new helper dev_pm_opp_set_opp() can be used for configuring the
    devices for a particular OPP and can be used by different type of
    devices, even the ones which don't change frequency (like power
    domains).

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • Drop the unnecessary parameters and follow the pattern from
    _generic_set_opp_regulator().

    While at it, also remove the local variable old_freq.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • In order to avoid conditional statements at the caller site, this patch
    updates _generic_set_opp_clk_only() to work for devices that don't
    change frequency (like power domains, etc.). Return 0 if the clk pointer
    passed to this routine is not valid.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The _generic_set_opp_regulator() helper will be used for devices which
    don't change frequency (like power domains, etc.) later on, prepare for
    that by not relying on frequency for making decisions here.

    While at it, update its parameters to pass only what is necessary.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The _set_opp() helper will be used for devices which don't change frequency
    (like power domains, etc.) later on, prepare for that by not relying on
    frequency for making decisions here.

    While at it, also update the debug print to contain all relevant
    information.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The _set_opp() helper will be used for devices which don't change their
    frequency (like power domains, etc.) later on, prepare for that by
    breaking the generic part out of dev_pm_opp_set_rate().

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • The dev_pm_opp_set_rate() helper needs to know the currently programmed
    OPP to make few decisions and currently we try to find it on every
    invocation of this routine.

    Lets start keeping track of the current_opp programmed for the devices
    of the opp table, that will be quite useful going forward.

    If we fail to find the current OPP, we pick the first one available in
    the list, as the list is in ascending order of frequencies, level, or
    bandwidth and that's the best guess we can make anyway.

    Note that we used to do the frequency comparison a bit early in
    dev_pm_opp_set_rate() previously, and now instead we check the target
    opp, which shall be more accurate anyway.

    We need to make sure that current_opp's memory doesn't get freed while
    it is being used and so we keep a reference of it until the time it is
    used.

    Now that current_opp will always be set, we can drop some unnecessary
    checks as well.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • Clock is not optional for users who call into dev_pm_opp_set_rate().
    Remove the unnecessary checks.

    While at it also drop the local variable for clk and use opp_table->clk
    instead.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • This routine has nothing to do with frequency, it just disables all the
    resources previously enabled. Rename it to match its purpose.

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • Check whether OPP table has regulators in _set_opp_custom() and set up
    dev_pm_set_opp_data accordingly. Now _set_opp_custom() works properly,
    i.e. it doesn't crash if OPP table doesn't have assigned regulators.

    Signed-off-by: Dmitry Osipenko
    [ Viresh: Rearrange the routine a bit ]
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko
     
  • Until now the ->set_opp() helper (i.e. special implementation for
    setting the OPPs for platforms) was implemented only to take care of
    multiple regulators case, but going forward we would need that for other
    use cases as well.

    This patch prepares for that by allocating the regulator specific part
    from dev_pm_opp_set_regulators() and the opp helper part from
    dev_pm_opp_register_set_opp_helper().

    Signed-off-by: Viresh Kumar
    Tested-by: Dmitry Osipenko

    Viresh Kumar
     
  • Print OPP level in debug message of _opp_add_static_v2(). This helps to
    chase GENPD bugs.

    Tested-by: Peter Geis
    Tested-by: Nicolas Chauvet
    Tested-by: Matt Merhar
    Signed-off-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko
     
  • NVIDIA Tegra SoCs have a power domains topology such that child domains
    only clamp a power rail, while parent domain controls shared performance
    state of the multiple child domains. In this case child's domain doesn't
    need to have OPP table. Hence we want to allow children power domains to
    pass performance state to the parent domain if child's domain doesn't have
    OPP table.

    The dev_pm_opp_xlate_performance_state() gets src_table=NULL if a child
    power domain doesn't have OPP table and in this case we should pass the
    performance state to the parent domain.

    Tested-by: Peter Geis
    Tested-by: Nicolas Chauvet
    Tested-by: Matt Merhar
    Signed-off-by: Dmitry Osipenko
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko
     
  • Add resource-managed version of dev_pm_opp_attach_genpd().

    Signed-off-by: Dmitry Osipenko
    [ Viresh: Manually apply the patch and relocate the routines ]
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko
     
  • Add resource-managed version of dev_pm_opp_register_set_opp_helper().

    Tested-by: Peter Geis
    Tested-by: Nicolas Chauvet
    Tested-by: Matt Merhar
    Signed-off-by: Dmitry Osipenko
    [ Viresh: Manually apply the patch and relocate the routines ]
    Signed-off-by: Viresh Kumar

    Dmitry Osipenko