Commit 390c4dd4 authored by Jesse Barnes's avatar Jesse Barnes Committed by Eric Anholt

drm/i915: handle FIFO oversubsription correctly

If you're pushing a plane hard (i.e. you need most or all of the FIFO
entries just to cover your frame refresh latency), the watermark level
may end up being negative.  So fix up the signed vs. unsigned math in
the calculation function to handle this correctly, giving all available
FIFO entries to such a configuration.
Reported-by: default avatarEric Anholt <eric@anholt.net>
Tested-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent dff33cfc
...@@ -1674,7 +1674,7 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz, ...@@ -1674,7 +1674,7 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
int pixel_size, int pixel_size,
unsigned long latency_ns) unsigned long latency_ns)
{ {
unsigned long entries_required, wm_size; long entries_required, wm_size;
entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000;
entries_required /= wm->cacheline_size; entries_required /= wm->cacheline_size;
...@@ -1685,9 +1685,10 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz, ...@@ -1685,9 +1685,10 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
DRM_DEBUG("FIFO watermark level: %d\n", wm_size); DRM_DEBUG("FIFO watermark level: %d\n", wm_size);
if (wm_size > wm->max_wm) /* Don't promote wm_size to unsigned... */
if (wm_size > (long)wm->max_wm)
wm_size = wm->max_wm; wm_size = wm->max_wm;
if (wm_size == 0) if (wm_size <= 0)
wm_size = wm->default_wm; wm_size = wm->default_wm;
return wm_size; return wm_size;
} }
......
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