Commit f6aca45c authored by Ben Widawsky's avatar Ben Widawsky Committed by Daniel Vetter

drm/i915: Clean up the ring scaling calculations

This patch attempts to clean up the ring/IA scaling programming in the
following ways.
1. Fix the comment about the DDR frequency. The math is 266MHz, not
133MHz. Formula was right, docs are wrong.

2. Mask the DCLK register since I don't know how it is defined on future
platforms.

3. use mult_frac instead of magic math.

This helps for future platform enabling.

v2: Actually use the right patch. The v1 was a mix of things, none of
which was right. Note that due to rounding, we actually get different
values (slightly higher) for the effective ring frequency.

v3: Use 1.25 instead of 1.33 as the original code did. (Jesse)

CC: Jesse Barnes <jbarnes@virtuousgeek.org>
CC: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
Reviewed-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent e41a56be
...@@ -3663,9 +3663,9 @@ void gen6_update_ring_freq(struct drm_device *dev) ...@@ -3663,9 +3663,9 @@ void gen6_update_ring_freq(struct drm_device *dev)
/* Convert from kHz to MHz */ /* Convert from kHz to MHz */
max_ia_freq /= 1000; max_ia_freq /= 1000;
min_ring_freq = I915_READ(MCHBAR_MIRROR_BASE_SNB + DCLK); min_ring_freq = I915_READ(MCHBAR_MIRROR_BASE_SNB + DCLK) & 0xf;
/* convert DDR frequency from units of 133.3MHz to bandwidth */ /* convert DDR frequency from units of 266.6MHz to bandwidth */
min_ring_freq = (2 * 4 * min_ring_freq + 2) / 3; min_ring_freq = mult_frac(min_ring_freq, 8, 3);
/* /*
* For each potential GPU frequency, load a ring frequency we'd like * For each potential GPU frequency, load a ring frequency we'd like
...@@ -3678,7 +3678,7 @@ void gen6_update_ring_freq(struct drm_device *dev) ...@@ -3678,7 +3678,7 @@ void gen6_update_ring_freq(struct drm_device *dev)
unsigned int ia_freq = 0, ring_freq = 0; unsigned int ia_freq = 0, ring_freq = 0;
if (IS_HASWELL(dev)) { if (IS_HASWELL(dev)) {
ring_freq = (gpu_freq * 5 + 3) / 4; ring_freq = mult_frac(gpu_freq, 5, 4);
ring_freq = max(min_ring_freq, ring_freq); ring_freq = max(min_ring_freq, ring_freq);
/* leave ia_freq as the default, chosen by cpufreq */ /* leave ia_freq as the default, chosen by cpufreq */
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment