• Srinivas Pandruvada's avatar
    cpufreq: intel_pstate: Support for energy performance hints with HWP · 984edbdc
    Srinivas Pandruvada authored
    It is possible to provide hints to the HWP algorithms in the processor
    to be more performance centric to more energy centric. These hints are
    provided by using HWP energy performance preference (EPP) or energy
    performance bias (EPB) settings.
    
    The scope of these settings is per logical processor, which means that
    each of the logical processors in the package can be programmed with a
    different value.
    
    This change provides cpufreq sysfs interface to provide hint. For each
    policy, two additional attributes will be available to check and provide
    hint. These attributes will only be present when the intel_pstate driver
    is using HWP mode.
    
    These attributes are:
     - energy_performance_available_preferences
     - energy_performance_preference
    
    To get list of supported hints:
    $ cat energy_performance_available_preferences
    default performance balance_performance balance_power power
    
    The current preference can be read or changed via cpufreq sysfs
    attribute "energy_performance_preference". Reading from this attribute
    will display current effective setting changed via any method. User can
    write any of the valid preference string to this attribute. User can
    always restore to power-on default by writing "default".
    
    Implementation
    Since these hints can be provided by direct MSR write or using some tools
    like x86_energy_perf_policy, the driver internally doesn't maintain any
    state. The user operation will result in direct read/write of MSR: 0x774
    (HWP_REQUEST_MSR). Also driver use read modify write to update other
    fields in this MSR.
    
    Summary of changes:
     - struct cpudata field epp_saved is renamed to epp_powersave, as this
       stores the value to restore once policy is switched from performance
       to powersave to restore original powersave EPP value.
     - A new struct cpudata field epp_saved is used to store the raw MSR
       EPP/EPB value when a CPU goes offline or on suspend and restore on
       online/resume. This ensures that EPP value is restored to correct
       value irrespective of the means used to set.
     - EPP/EPB value ranges are fixed for each preference, which can be
       set for the cpufreq sysfs, so user request is mapped to/from this
       range.
     - New attributes are only added when HWP is present.
     - Since EPP value of 0 is valid the fields are initialized to
       -EINVAL when not valid. The field epp_default is read only once
       after powerup to avoid reading on subsequent CPU online operation
     - New suspend callback to store epp on suspend operation
     - Don't invalidate old epp_saved field on resume and online as now
       we can restore last epp value on suspend and this field can still
       have old EPP value sampled during switch to performance from
       powersave.
     - While here optimized setting of cpu_data->epp_powersave = epp in
       intel_pstate_hwp_set() as this was done in both true and false
       paths.
     - epp/epb set function returns error to caller on failure to pass
       on to user space for display.
    Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    984edbdc
intel_pstate.c 62.4 KB