lkml.org 
[lkml]   [2018]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 014/157] PM / OPP: Update voltage in case freq == old_freq
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@gmail.com>

    commit c5c2a97b3ac7d1ec19e7cff9e38caca6afefc3de upstream.

    This commit fixes a rare but possible case when the clk rate is updated
    without update of the regulator voltage.

    At boot up, CPUfreq checks if the system is running at the right freq. This
    is a sanity check in case a bootloader set clk rate that is outside of freq
    table present with cpufreq core. In such cases system can be unstable so
    better to change it to a freq that is preset in freq-table.

    The CPUfreq takes next freq that is >= policy->cur and this is our
    target_freq that needs to be set now.

    dev_pm_opp_set_rate(dev, target_freq) checks the target_freq and the
    old_freq (a current rate). If these are equal it returns early. If not,
    it searches for OPP (old_opp) that fits best to old_freq (not listed in
    the table) and updates old_freq (!).

    Here, we can end up with old_freq = old_opp.rate = target_freq, which
    is not handled in _generic_set_opp_regulator(). It's supposed to update
    voltage only when freq > old_freq || freq > old_freq.

    if (freq > old_freq) {
    ret = _set_opp_voltage(dev, reg, new_supply);
    [...]
    if (freq < old_freq) {
    ret = _set_opp_voltage(dev, reg, new_supply);
    if (ret)

    It results in, no voltage update while clk rate is updated.

    Example:
    freq-table = {
    1000MHz 1.15V
    666MHZ 1.10V
    333MHz 1.05V
    }
    boot-up-freq = 800MHz # not listed in freq-table
    freq = target_freq = 1GHz
    old_freq = 800Mhz
    old_opp = _find_freq_ceil(opp_table, &old_freq); #(old_freq is modified!)
    old_freq = 1GHz

    Fixes: 6a0712f6f199 ("PM / OPP: Add dev_pm_opp_set_rate()")
    Cc: 4.6+ <stable@vger.kernel.org> # v4.6+
    Signed-off-by: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@gmail.com>
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/base/power/opp/core.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/drivers/base/power/opp/core.c
    +++ b/drivers/base/power/opp/core.c
    @@ -552,7 +552,7 @@ static int _generic_set_opp_regulator(co
    }

    /* Scaling up? Scale voltage before frequency */
    - if (freq > old_freq) {
    + if (freq >= old_freq) {
    ret = _set_opp_voltage(dev, reg, new_supply);
    if (ret)
    goto restore_voltage;

    \
     
     \ /
      Last update: 2018-07-01 20:04    [W:3.606 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site