• Rafael J. Wysocki's avatar
    cpufreq: intel_pstate: Avoid missing HWP max updates in passive mode · e0be38ed
    Rafael J. Wysocki authored
    If the cpufreq policy max limit is changed when intel_pstate operates
    in the passive mode with HWP enabled and the "powersave" governor is
    used on top of it, the HWP max limit is not updated as appropriate.
    
    Namely, in the "powersave" governor case, the target P-state
    is always equal to the policy min limit, so if the latter does
    not change, intel_cpufreq_adjust_hwp() is not invoked to update
    the HWP Request MSR due to the "target_pstate != old_pstate" check
    in intel_cpufreq_update_pstate(), so the HWP max limit is not
    updated as a result.
    
    Also, if the CPUFREQ_NEED_UPDATE_LIMITS flag is not set for the
    driver and the target frequency does not change along with the
    policy max limit, the "target_freq == policy->cur" check in
    __cpufreq_driver_target() prevents the driver's ->target() callback
    from being invoked at all, so the HWP max limit is not updated.
    
    To prevent that occurring, set the CPUFREQ_NEED_UPDATE_LIMITS flag
    in the intel_cpufreq driver structure if HWP is enabled and modify
    intel_cpufreq_update_pstate() to do the "target_pstate != old_pstate"
    check only in the non-HWP case and let intel_cpufreq_adjust_hwp()
    always run in the HWP case (it will update HWP Request only if the
    cached value of the register is different from the new one including
    the limits, so if neither the target P-state value nor the max limit
    changes, the register write will still be avoided).
    
    Fixes: f6ebbcf0 ("cpufreq: intel_pstate: Implement passive mode with HWP enabled")
    Reported-by: default avatarZhang Rui <rui.zhang@intel.com>
    Cc: 5.9+ <stable@vger.kernel.org> # 5.9+: 1c534352 cpufreq: Introduce CPUFREQ_NEED_UPDATE_LIMITS ...
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    Tested-by: default avatarZhang Rui <rui.zhang@intel.com>
    e0be38ed
intel_pstate.c 77.5 KB