drm/i915: handle FIFO oversubsription correctly
authorJesse Barnes <jbarnes@virtuousgeek.org>
Thu, 16 Jul 2009 20:01:01 +0000 (13:01 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 16 Jul 2009 20:02:33 +0000 (13:02 -0700)
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: Eric Anholt <eric@anholt.net>
Tested-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_display.c

index 3fa0d63c83b9e698085db3aee6b859521f17f5a7..890f7108e723c1b5878ff9ca1f701d467a3e5ee4 100644 (file)
@@ -1674,7 +1674,7 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
                                        int pixel_size,
                                        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 /= wm->cacheline_size;
@@ -1685,9 +1685,10 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
 
        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;
-       if (wm_size == 0)
+       if (wm_size <= 0)
                wm_size = wm->default_wm;
        return wm_size;
 }