• Rob Clark's avatar
    drm/msm: Devfreq tuning · 9bc95570
    Rob Clark authored
    This adds a few things to try and make frequency scaling better match
    the workload:
    
    1) Longer polling interval to avoid whip-lashing between too-high and
       too-low frequencies in certain workloads, like mobile games which
       throttle themselves to 30fps.
    
       Previously our polling interval was short enough to let things
       ramp down to minimum freq in the "off" frame, but long enough to
       not react quickly enough when rendering started on the next frame,
       leading to uneven frame times.  (Ie. rather than a consistent 33ms
       it would alternate between 16/33/48ms.)
    
    2) Awareness of when the GPU is active vs idle.  Since we know when
       the GPU is active vs idle, we can clamp the frequency down to the
       minimum while it is idle.  (If it is idle for long enough, then
       the autosuspend delay will eventually kick in and power down the
       GPU.)
    
       Since devfreq has no knowledge of powered-but-idle, this takes a
       small bit of trickery to maintain a "fake" frequency while idle.
       This, combined with the longer polling period allows devfreq to
       arrive at a reasonable "active" frequency, while still clamping
       to minimum freq when idle to reduce power draw.
    
    3) Boost.  Because simple_ondemand needs to see a certain threshold
       of busyness to ramp up, we could end up needing multiple polling
       cycles before it reacts appropriately on interactive workloads
       (ex. scrolling a web page after reading for some time), on top
       of the already lengthened polling interval, when we see a idle
       to active transition after a period of idle time we boost the
       frequency that we return to.
    Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
    Link: https://lore.kernel.org/r/20210726144653.2180096-4-robdclark@gmail.comSigned-off-by: default avatarRob Clark <robdclark@chromium.org>
    9bc95570
msm_gpu.h 10.6 KB