WSL2-Linux-Kernel/drivers/gpu/drm/i915
Chris Wilson b29c19b645 drm/i915: Boost RPS frequency for CPU stalls
If we encounter a situation where the CPU blocks waiting for results
from the GPU, give the GPU a kick to boost its the frequency.

This should work to reduce user interface stalls and to quickly promote
mesa to high frequencies - but the cost is that our requested frequency
stalls high (as we do not idle for long enough before rc6 to start
reducing frequencies, nor are we aggressive at down clocking an
underused GPU). However, this should be mitigated by rc6 itself powering
off the GPU when idle, and that energy use is dependent upon the workload
of the GPU in addition to its frequency (e.g. the math or sampler
functions only consume power when used). Still, this is likely to
adversely affect light workloads.

In particular, this nearly eliminates the highly noticeable wake-up lag
in animations from idle. For example, expose or workspace transitions.
(However, given the situation where we fail to downclock, our requested
frequency is almost always the maximum, except for Baytrail where we
manually downclock upon idling. This often masks the latency of
upclocking after being idle, so animations are typically smooth - at the
cost of increased power consumption.)

Stéphane raised the concern that this will punish good applications and
reward bad applications - but due to the nature of how mesa performs its
client throttling, I believe all mesa applications will be roughly
equally affected. To address this concern, and to prevent applications
like compositors from permanently boosting the RPS state, we ratelimit the
frequency of the wait-boosts each client recieves.

Unfortunately, this techinique is ineffective with Ironlake - which also
has dynamic render power states and suffers just as dramatically. For
Ironlake, the thermal/power headroom is shared with the CPU through
Intelligent Power Sharing and the intel-ips module. This leaves us with
no GPU boost frequencies available when coming out of idle, and due to
hardware limitations we cannot change the arbitration between the CPU and
GPU quickly enough to be effective.

v2: Limit each client to receiving a single boost for each active period.
    Tested by QA to only marginally increase power, and to demonstrably
    increase throughput in games. No latency measurements yet.

v3: Cater for front-buffer rendering with manual throttling.

v4: Tidy up.

v5: Sadly the compositor needs frequent boosts as it may never idle, but
due to its picking mechanism (using ReadPixels) may require frequent
waits. Those waits, along with the waits for the vrefresh swap, conspire
to keep the GPU at low frequencies despite the interactive latency. To
overcome this we ditch the one-boost-per-active-period and just ratelimit
the number of wait-boosts each client can receive.

Reported-and-tested-by: Paul Neumann <paul104x@yahoo.de>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68716
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Kenneth Graunke <kenneth@whitecape.org>
Cc: Stéphane Marchesin <stephane.marchesin@gmail.com>
Cc: Owen Taylor <otaylor@redhat.com>
Cc: "Meng, Mengmeng" <mengmeng.meng@intel.com>
Cc: "Zhuang, Lena" <lena.zhuang@intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
[danvet: No extern for function prototypes in headers.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-10-03 20:01:31 +02:00
..
Makefile drm/i915: add VLV DSI PLL Calculations 2013-09-04 17:34:48 +02:00
dvo.h drm/i915: Remove unused mode_fixup() vfunc of struct intel_dvo_dev_ops 2013-09-05 21:39:59 +02:00
dvo_ch7xxx.c drm/i915: dvo_ch7xxx: fix vsync polarity setting 2013-07-25 16:10:22 +02:00
dvo_ch7017.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ivch.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ns2501.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_sil164.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_tfp410.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
i915_debugfs.c drm/i915: Fix __wait_seqno to use true infinite timeouts 2013-10-03 20:01:30 +02:00
i915_dma.c drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
i915_drv.c drm/i915: fix typo s/PatherPoint/PantherPoint/ 2013-10-01 14:36:18 +02:00
i915_drv.h drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
i915_gem.c drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
i915_gem_context.c drm/i915: Convert active API to VMA 2013-10-01 07:45:21 +02:00
i915_gem_debug.c drm/i915: Fix #endif comment 2013-08-09 10:45:52 +02:00
i915_gem_dmabuf.c drm/i915: Pin pages whilst mapping the dma-buf 2013-09-03 19:17:58 +02:00
i915_gem_evict.c drm/i915: trace vm eviction instead of everything 2013-10-01 07:45:20 +02:00
i915_gem_execbuffer.c drm/i915: Convert active API to VMA 2013-10-01 07:45:21 +02:00
i915_gem_gtt.c drm/i915: Use kcalloc more 2013-10-01 07:45:01 +02:00
i915_gem_stolen.c Linux 3.12-rc2 2013-09-24 09:32:53 +02:00
i915_gem_tiling.c drm/i915: Use kcalloc more 2013-10-01 07:45:01 +02:00
i915_gpu_error.c drm/i915: Fix __wait_seqno to use true infinite timeouts 2013-10-03 20:01:30 +02:00
i915_ioc32.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
i915_irq.c drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
i915_reg.h drm/i915/vlv: use correct units for rc6 residency v2 2013-10-01 07:45:44 +02:00
i915_suspend.c drm/i915: don't save/restore LBB on Gen5+ 2013-09-13 11:40:45 +02:00
i915_sysfs.c drm/i915/vlv: use correct units for rc6 residency v2 2013-10-01 07:45:44 +02:00
i915_trace.h drm/i915: Add a tracepoint for using a semaphore 2013-10-01 07:45:24 +02:00
i915_trace_points.c
i915_ums.c drm/i915: scrap register address storage 2013-06-10 19:54:14 +02:00
intel_acpi.c i915: fix ACPI _DSM warning 2013-08-05 19:04:05 +02:00
intel_bios.c drm/i915: Rip out SUPPORTS_EDP 2013-10-01 07:45:07 +02:00
intel_bios.h drm/i915: use the HDMI DDI buffer translations from VBT 2013-10-01 07:45:04 +02:00
intel_crt.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_ddi.c drm/i915: Add HSW CRT output readout support 2013-10-01 07:45:15 +02:00
intel_display.c drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
intel_dp.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_drv.h drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
intel_dsi.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_dsi.h drm/i915: add VLV DSI PLL Calculations 2013-09-04 17:34:48 +02:00
intel_dsi_cmd.c drm/i915/dsi: s/size_t/int/ 2013-09-04 17:34:51 +02:00
intel_dsi_cmd.h drm/i915/dsi: s/size_t/int/ 2013-09-04 17:34:51 +02:00
intel_dsi_pll.c drm/i915: Use adjusted_mode in DSI PLL calculations 2013-09-16 23:36:38 +02:00
intel_dvo.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_fb.c drm/i915: make intel_crtc_fb_gamma_{set, get} static 2013-10-01 07:45:18 +02:00
intel_hdmi.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_i2c.c drm/i915: Program GMBUS Frequency based on the CDCLK for VLV. 2013-10-01 07:45:41 +02:00
intel_lvds.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_modes.c drm/i915: Add "Automatic" mode for the "Broadcast RGB" property 2013-01-20 13:09:44 +01:00
intel_opregion.c Linux 3.12-rc2 2013-09-24 09:32:53 +02:00
intel_overlay.c drm/i915: use pointer = k[cmz...]alloc(sizeof(*pointer), ...) pattern 2013-10-01 07:45:01 +02:00
intel_panel.c drm/i915/vlv: hack to init backlight regs if BIOS fails to do so v2 2013-10-01 07:45:41 +02:00
intel_pm.c drm/i915: Boost RPS frequency for CPU stalls 2013-10-03 20:01:31 +02:00
intel_ringbuffer.c drm/i915: s/HAS_L3_GPU_CACHE/HAS_L3_DPF 2013-09-19 20:41:00 +02:00
intel_ringbuffer.h drm/i915: Write RING_TAIL once per-request 2013-09-10 15:35:58 +02:00
intel_sdvo.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_sdvo_regs.h drm/i915: clear the entire sdvo infoframe buffer 2012-10-24 15:12:48 +02:00
intel_sideband.c drm/i915: Add additional pipe parameter for vlv_dpio_read and vlv_dpio_write. v2 2013-09-05 15:04:36 +02:00
intel_sprite.c drm/i915: use pointer = k[cmz...]alloc(sizeof(*pointer), ...) pattern 2013-10-01 07:45:01 +02:00
intel_tv.c drm/i915: destroy connector sysfs files earlier 2013-10-01 07:45:48 +02:00
intel_uncore.c drm/i915: Delay the release of the forcewake by a jiffie 2013-10-01 07:45:13 +02:00