06 Jan, 2021

2 commits

  • commit 0e1d9ca1766f5d95fb881f57b6c4a1ffa63d4648 upstream.

    Fix the clock reference counting by calling the missing clk_put() in the
    error path.

    Cc: v5.10 # v5.10
    Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER")
    Signed-off-by: Viresh Kumar
    Signed-off-by: Greg Kroah-Hartman

    Viresh Kumar
     
  • commit 976509bb310b913d30577f15b58bdd30effb0542 upstream.

    In function _allocate_opp_table, opp_dev is allocated and referenced
    by opp_table via _add_opp_dev. But in the case that the subsequent calls
    return -EPROBE_DEFER, it will jump to err label and opp_table will be
    freed. Then opp_dev becomes an unreferenced object to cause memory leak.
    So let's call _remove_opp_dev to do the cleanup.

    This fixes the following kmemleak report:

    unreferenced object 0xffff000801524a00 (size 128):
    comm "swapper/0", pid 1, jiffies 4294892465 (age 84.616s)
    hex dump (first 32 bytes):
    40 00 56 01 08 00 ff ff 40 00 56 01 08 00 ff ff @.V.....@.V.....
    b8 52 77 7f 08 00 ff ff 00 3c 4c 00 08 00 ff ff .Rw......] kmemleak_alloc+0x30/0x40
    [] kmem_cache_alloc+0x3d4/0x588
    [] _add_opp_dev+0x2c/0x88
    [] _add_opp_table_indexed+0x124/0x268
    [] dev_pm_opp_of_add_table+0x20/0x1d8
    [] dev_pm_opp_of_cpumask_add_table+0x48/0xf0
    [] dt_cpufreq_probe+0x20c/0x448
    [] platform_probe+0x68/0xd8
    [] really_probe+0xd0/0x3a0
    [] driver_probe_device+0x58/0xb8
    [] device_driver_attach+0x74/0x80
    [] __driver_attach+0x58/0xe0
    [] bus_for_each_dev+0x70/0xc8
    [] driver_attach+0x24/0x30
    [] bus_add_driver+0x14c/0x1f0
    [] driver_register+0x64/0x120

    Cc: v5.10 # v5.10
    Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER")
    Signed-off-by: Quanyang Wang
    [ Viresh: Added the stable tag ]
    Signed-off-by: Viresh Kumar
    Signed-off-by: Greg Kroah-Hartman

    Quanyang Wang
     

27 Oct, 2020

3 commits


05 Oct, 2020

1 commit

  • Pull opertaing performance points (OPP) framework fixes for 5.10-rc1
    from Viresh Kumar:

    "- Return -EPROBE_DEFER properly from dev_pm_opp_get_opp_table()
    (Stephan Gerhold).

    - Minor cleanups around required-opps (Stephan Gerhold).

    - Extends opp-supported-hw property to contain multiple versions
    (Viresh Kumar).

    - Multiple cleanups around dev_pm_opp_attach_genpd() (Viresh Kumar).

    - Multiple fixes, cleanups in the OPP core for overall better design
    (Viresh Kumar)."

    * 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
    opp: Allow opp-level to be set to 0
    opp: Prevent memory leak in dev_pm_opp_attach_genpd()
    ARM: tegra: Pass multiple versions in opp-supported-hw property
    opp: Allow opp-supported-hw to contain multiple versions
    dt-bindings: opp: Allow opp-supported-hw to contain multiple versions
    opp: Set required OPPs in reverse order when scaling down
    opp: Reduce code duplication in _set_required_opps()
    opp: Drop unnecessary check from dev_pm_opp_attach_genpd()
    opp: Handle multiple calls for same OPP table in _of_add_opp_table_v1()
    opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER
    opp: Remove _dev_pm_opp_find_and_remove_table() wrapper
    opp: Split out _opp_set_rate_zero()
    opp: Reuse the enabled flag in !target_freq path
    opp: Rename regulator_enabled and use it as status of all resources

    Rafael J. Wysocki
     

16 Sep, 2020

8 commits

  • The DT bindings don't put such a constraint, nor should the kernel. It
    is perfectly fine for opp-level to be set to 0, if we need to put the
    performance state votes for a domain for a particular OPP.

    Reported-by: Stephan Gerhold
    Tested-by: Stephan Gerhold
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • If dev_pm_opp_attach_genpd() is called multiple times (once for each CPU
    sharing the table), then it would result in unwanted behavior like
    memory leak, attaching the domain multiple times, etc.

    Handle that by checking and returning earlier if the domains are already
    attached. Now that dev_pm_opp_detach_genpd() can get called multiple
    times as well, we need to protect that too.

    Note that the virtual device pointers aren't returned in this case, as
    they may become unavailable to some callers during the middle of the
    operation.

    Reported-by: Stephan Gerhold
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • The bindings allow multiple versions to be passed to "opp-supported-hw"
    property, either of which can result in enabling of the OPP.

    Update code to allow that.

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

    Viresh Kumar
     
  • The OPP core already has well-defined semantics to ensure required
    OPPs/regulators are set before/after the frequency change, depending
    on if we scale up or down.

    Similar requirements might exist for the order of required OPPs
    when multiple power domains need to be scaled for a frequency change.

    For example, on Qualcomm platforms using CPR (Core Power Reduction),
    we need to scale the VDDMX and CPR power domain. When scaling up,
    MX should be scaled up before CPR. When scaling down, CPR should be
    scaled down before MX.

    In general, if there are multiple "required-opps" in the device tree
    I would expect that the order is either irrelevant, or there is some
    dependency between the power domains. In that case, the power domains
    should be scaled down in reverse order.

    This commit updates _set_required_opps() to set required OPPs in
    reverse order when scaling down.

    Signed-off-by: Stephan Gerhold
    [ Viresh: Fix rebase conflict and minor rearrangement of the code ]
    Signed-off-by: Viresh Kumar

    Stephan Gerhold
     
  • Move call to dev_pm_genpd_set_performance_state() to a separate
    function so we can avoid duplicating the code for the single and
    multiple genpd case.

    Signed-off-by: Stephan Gerhold
    [ Viresh: Validate virtual device before use ]
    Signed-off-by: Viresh Kumar

    Stephan Gerhold
     
  • Since commit c0ab9e0812da ("opp: Allocate genpd_virt_devs from
    dev_pm_opp_attach_genpd()"), the allocation of the virtual devices is
    moved to dev_pm_opp_attach_genpd() and this check isn't required anymore
    as it will always fail. Drop it.

    Signed-off-by: Viresh Kumar

    Viresh Kumar
     
  • Viresh Kumar
     
  • Until now for V1 OPP bindings we used to call
    dev_pm_opp_of_cpumask_add_table() first and then
    dev_pm_opp_set_sharing_cpus() in the cpufreq-dt driver.

    A later patch will though update the cpufreq-dt driver to optimize the
    code a bit and we will call dev_pm_opp_set_sharing_cpus() first followed
    by dev_pm_opp_of_cpumask_add_table(), which doesn't work well today as
    it tries to re parse the OPP entries. This should work nevertheless for
    V1 bindings as the same works for V2 bindings.

    Adapt the same approach from V2 bindings and fix this.

    Reported-by: Marek Szyprowski
    Tested-by: Marek Szyprowski
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

02 Sep, 2020

1 commit


31 Aug, 2020

1 commit

  • dev_pm_opp_remove_table() should drop a reference to the OPP table only
    if the DT OPP table was parsed earlier with a call to
    dev_pm_opp_of_add_table() earlier. Else it may end up dropping the
    reference to the OPP table, which was added as a result of other calls
    like dev_pm_opp_set_clkname(). And would hence result in undesirable
    behavior later on when caller would try to free the resource again.

    Fixes: 03758d60265c ("opp: Replace list_kref with a local counter")
    Reported-by: Naresh Kamboju
    Reported-by: Anders Roxell
    Tested-by: Naresh Kamboju
    Signed-off-by: Viresh Kumar

    Viresh Kumar
     

25 Aug, 2020

1 commit

  • The OPP core manages various resources, e.g. clocks or interconnect paths.
    These resources are looked up when the OPP table is allocated once
    dev_pm_opp_get_opp_table() is called the first time (either directly
    or indirectly through one of the many helper functions).

    At this point, the resources may not be available yet, i.e. looking them
    up will result in -EPROBE_DEFER. Unfortunately, dev_pm_opp_get_opp_table()
    is currently unable to propagate this error code since it only returns
    the allocated OPP table or NULL.

    This means that all consumers of the OPP core are required to make sure
    that all necessary resources are available. Usually this happens by
    requesting them, checking the result and releasing them immediately after.

    For example, we have added "dev_pm_opp_of_find_icc_paths(dev, NULL)" to
    several drivers now just to make sure the interconnect providers are
    ready before the OPP table is allocated. If this call is missing,
    the OPP core will only warn about this and then attempt to continue
    without interconnect. This will eventually fail horribly, e.g.:

    cpu cpu0: _allocate_opp_table: Error finding interconnect paths: -517
    ... later ...
    of: _read_bw: Mismatch between opp-peak-kBps and paths (1 0)
    cpu cpu0: _opp_add_static_v2: opp key field not found
    cpu cpu0: _of_add_opp_table_v2: Failed to add OPP, -22

    This example happens when trying to use interconnects for a CPU OPP
    table together with qcom-cpufreq-nvmem.c. qcom-cpufreq-nvmem calls
    dev_pm_opp_set_supported_hw(), which ends up allocating the OPP table
    early. To fix the problem with the current approach we would need to add
    yet another call to dev_pm_opp_of_find_icc_paths(dev, NULL).
    But actually qcom-cpufreq-nvmem.c has nothing to do with interconnects...

    This commit attempts to make this more robust by allowing
    dev_pm_opp_get_opp_table() to return an error pointer. Fixing all
    the usages is trivial because the function is usually used indirectly
    through another helper (e.g. dev_pm_opp_set_supported_hw() above).
    These other helpers already return an error pointer.

    The example above then works correctly because set_supported_hw() will
    return -EPROBE_DEFER, and qcom-cpufreq-nvmem.c already propagates that
    error. It should also be possible to remove the remaining usages of
    "dev_pm_opp_of_find_icc_paths(dev, NULL)" from other drivers as well.

    Note that this commit currently only handles -EPROBE_DEFER for the
    clock/interconnects within _allocate_opp_table(). Other errors are just
    ignored as before. Eventually those should be propagated as well.

    Signed-off-by: Stephan Gerhold
    Acked-by: Krzysztof Kozlowski
    Reviewed-by: Ulf Hansson
    [ Viresh: skip checking return value of dev_pm_opp_get_opp_table() for
    EPROBE_DEFER in domain.c, fix NULL return value and reorder
    code a bit in core.c, and update exynos-asv.c ]
    Signed-off-by: Viresh Kumar

    Stephan Gerhold
     

24 Aug, 2020

4 commits


20 Aug, 2020

1 commit

  • dev_pm_opp_set_rate() can now be called with freq = 0 in order
    to either drop performance or bandwidth votes or to disable
    regulators on platforms which support them.

    In such cases, a subsequent call to dev_pm_opp_set_rate() with
    the same frequency ends up returning early because 'old_freq == freq'

    Instead make it fall through and put back the dropped performance
    and bandwidth votes and/or enable back the regulators.

    Cc: v5.3+ # v5.3+
    Fixes: cd7ea582866f ("opp: Make dev_pm_opp_set_rate() handle freq = 0 to drop performance votes")
    Reported-by: Sajida Bhanu
    Reviewed-by: Sibi Sankar
    Reported-by: Matthias Kaehlcke
    Tested-by: Matthias Kaehlcke
    Reviewed-by: Stephen Boyd
    Signed-off-by: Rajendra Nayak
    [ Viresh: Don't skip clk_set_rate() and massaged changelog ]
    Signed-off-by: Viresh Kumar

    Rajendra Nayak
     

17 Aug, 2020

2 commits

  • We get the opp_table pointer at the top of the function and so we should
    put the pointer at the end of the function like all other exit paths
    from this function do.

    Cc: v5.8+ # v5.8+
    Fixes: b00e667a6d8b ("opp: Remove bandwidth votes when target_freq is zero")
    Reviewed-by: Rajendra Nayak
    Signed-off-by: Stephen Boyd
    [ Viresh: Split the patch into two ]
    Signed-off-by: Viresh Kumar

    Stephen Boyd
     
  • We get the opp_table pointer at the top of the function and so we should
    put the pointer at the end of the function like all other exit paths
    from this function do.

    Cc: v5.7+ # v5.7+
    Fixes: aca48b61f963 ("opp: Manage empty OPP tables with clk handle")
    Reviewed-by: Rajendra Nayak
    Signed-off-by: Stephen Boyd
    [ Viresh: Split the patch into two ]
    Signed-off-by: Viresh Kumar

    Stephen Boyd
     

04 Aug, 2020

1 commit

  • Pull ARM cpufreq driver changes for v5.9-rc1 from Viresh Kumar:

    "Here are the details:

    - Adaptive voltage scaling (AVS) support and minor cleanups for
    brcmstb driver (Florian Fainelli and Markus Mayer).

    - A new tegra driver and cleanup for the existing one (Sumit Gupta and
    Jon Hunter).

    - Bandwidth level support for Qcom driver along with OPP changes (Sibi
    Sankar).

    - Cleanups to sti, cpufreq-dt, ap806, CPPC drivers (Viresh Kumar, Lee
    Jones, Ivan Kokshaysky, Sven Auhagen, and Xin Hao).

    - Make schedutil default governor for ARM (Valentin Schneider).

    - Fix dependency issues for imx (Walter Lozano).

    - Cleanup around cached_resolved_idx in cpufreq core (Viresh Kumar)."

    * 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
    cpufreq: make schedutil the default for arm and arm64
    cpufreq: cached_resolved_idx can not be negative
    cpufreq: Add Tegra194 cpufreq driver
    dt-bindings: arm: Add NVIDIA Tegra194 CPU Complex binding
    cpufreq: imx: Select NVMEM_IMX_OCOTP
    cpufreq: sti-cpufreq: Fix some formatting and misspelling issues
    cpufreq: tegra186: Simplify probe return path
    cpufreq: CPPC: Reuse caps variable in few routines
    cpufreq: ap806: fix cpufreq driver needs ap cpu clk
    cpufreq: cppc: Reorder code and remove apply_hisi_workaround variable
    cpufreq: dt: fix oops on armada37xx
    cpufreq: brcmstb-avs-cpufreq: send S2_ENTER / S2_EXIT commands to AVS
    cpufreq: brcmstb-avs-cpufreq: Support polling AVS firmware
    cpufreq: brcmstb-avs-cpufreq: more flexible interface for __issue_avs_command()
    cpufreq: qcom: Disable fast switch when scaling DDR/L3
    cpufreq: qcom: Update the bandwidth levels on frequency change
    OPP: Add and export helper to set bandwidth
    cpufreq: blacklist SC7180 in cpufreq-dt-platdev
    cpufreq: blacklist SDM845 in cpufreq-dt-platdev

    Rafael J. Wysocki
     

03 Aug, 2020

1 commit

  • * pm-em:
    OPP: refactor dev_pm_opp_of_register_em() and update related drivers
    Documentation: power: update Energy Model description
    PM / EM: change name of em_pd_energy to em_cpu_energy
    PM / EM: remove em_register_perf_domain
    PM / EM: add support for other devices than CPUs in Energy Model
    PM / EM: update callback structure and add device pointer
    PM / EM: introduce em_dev_register_perf_domain function
    PM / EM: change naming convention from 'capacity' to 'performance'

    * pm-core:
    mmc: jz4740: Use pm_ptr() macro
    PM: Make *_DEV_PM_OPS macros use __maybe_unused
    PM: core: introduce pm_ptr() macro

    Rafael J. Wysocki
     

30 Jul, 2020

1 commit


24 Jul, 2020

3 commits


16 Jul, 2020

1 commit

  • Currently, when using _of_add_opp_table_v2 parsed_static_opps is
    increased and this value is used in _opp_remove_all_static() to
    check if there are static opp entries that need to be freed.
    Unfortunately this does not happen when using _of_add_opp_table_v1(),
    which leads to warnings.

    This patch increases parsed_static_opps in _of_add_opp_table_v1() in a
    similar way as in _of_add_opp_table_v2().

    Fixes: 03758d60265c ("opp: Replace list_kref with a local counter")
    Cc: v5.6+ # v5.6+
    Signed-off-by: Walter Lozano
    [ Viresh: Do the operation with lock held and set the value to 1 instead
    of incrementing it ]
    Signed-off-by: Viresh Kumar

    Walter Lozano
     

24 Jun, 2020

2 commits

  • The Energy Model framework supports not only CPU devices. Drop the CPU
    specific interface with cpumask and add struct device. Add also a return
    value, user might use it. This new interface provides easy way to create
    a simple Energy Model, which then might be used by e.g. thermal subsystem.

    Acked-by: Daniel Lezcano
    Signed-off-by: Lukasz Luba
    Signed-off-by: Rafael J. Wysocki

    Lukasz Luba
     
  • The Energy Model framework is going to support devices other that CPUs. In
    order to make this happen change the callback function and add pointer to
    a device as an argument.

    Update the related users to use new function and new callback from the
    Energy Model.

    Acked-by: Quentin Perret
    Signed-off-by: Lukasz Luba
    Acked-by: Daniel Lezcano
    Signed-off-by: Rafael J. Wysocki

    Lukasz Luba
     

14 Jun, 2020

1 commit

  • Since commit 84af7a6194e4 ("checkpatch: kconfig: prefer 'help' over
    '---help---'"), the number of '---help---' has been gradually
    decreasing, but there are still more than 2400 instances.

    This commit finishes the conversion. While I touched the lines,
    I also fixed the indentation.

    There are a variety of indentation styles found.

    a) 4 spaces + '---help---'
    b) 7 spaces + '---help---'
    c) 8 spaces + '---help---'
    d) 1 space + 1 tab + '---help---'
    e) 1 tab + '---help---' (correct indentation)
    f) 1 tab + 1 space + '---help---'
    g) 1 tab + 2 spaces + '---help---'

    In order to convert all of them to 1 tab + 'help', I ran the
    following commend:

    $ find . -name 'Kconfig*' | xargs sed -i 's/^[[:space:]]*---help---/\thelp/'

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

01 Jun, 2020

1 commit

  • The DT node of the device may contain interconnect paths while the OPP
    table doesn't have the bandwidth values. There is no need to parse the
    paths in such cases.

    Signed-off-by: Sibi Sankar
    Tested-by: Sibi Sankar
    Reviewed-by: Sibi Sankar
    [ Viresh: Support the case of !opp_table and massaged changelog ]
    Signed-off-by: Viresh Kumar

    Sibi Sankar
     

29 May, 2020

5 commits