• Srinivas Pandruvada's avatar
    cpufreq: intel_pstate: Correct frequency setting in the HWP mode · 3f8ed54a
    Srinivas Pandruvada authored
    In the functions intel_pstate_hwp_set(), min/max range from HWP capability
    MSR along with max_perf_pct and min_perf_pct, is used to set the HWP
    request MSR. In some cases this doesn't result in the correct HWP max/min
    in HWP request.
    
    For example: In the following case:
    
    HWP capabilities from MSR 0x771
    0x70a1220
    
    Here cpufreq min/max frequencies from above MSR dump are 700MHz and 3.2GHz
    respectively.
    
    This will result in
    hwp_min = 0x07
    hwp_max = 0x20
    
    To limit max frequency to 2GHz:
    
    perf_limits->max_perf_pct = 63 (2GHz as a percent of 3.2GHz rounded up)
    
    With the current calculation:
    adj_range = max_perf_pct * range / 100;
    adj_range = 63 * (32 - 7) / 100
    adj_range = 15
    
    max = hw_min + adj_range;
    max = 7 + 15 = 22
    
    This will result in HWP request of 0x160f, which will result in a
    frequency cap of 2.2GHz not 2GHz.
    
    The problem with the above calculation is that hwp_min of 7 is treated
    as 0% in the range. But max_perf_pct is calculated with respect to minimum
    as 0 and max as 3.2GHz or hwp_max, so adding hwp_min to it will result in
    more than the desired.
    
    Since the min_perf_pct and max_perf_pct is already a percent of max
    frequency or hwp_max, this min/max HWP request value can be calculated
    directly applying these percentage to hwp_max.
    Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    3f8ed54a
intel_pstate.c 69.4 KB