Skip to content

Commit

Permalink
drm/i915/fbc: fix the check for already reserved fbc size
Browse files Browse the repository at this point in the history
The check for previously reserved stolen space size for FBC in
i915_gem_stolen_setup_compression() did not take the compression
threshold into account. Fix this by storing and comparing to
uncompressed size instead.

The bug has been introduced in

commit 5e59f71
Author: Ben Widawsky <benjamin.widawsky@intel.com>
Date:   Mon Jun 30 10:41:24 2014 -0700

    drm/i915: Try harder to get FBC

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88975
Suggested-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ben Widawsky <benjamin.widawsky@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Jani Nikula authored and Daniel Vetter committed Feb 13, 2015
1 parent 719388e commit 60ee5cd
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 6 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ struct intel_context {
};

struct i915_fbc {
unsigned long size;
unsigned long uncompressed_size;
unsigned threshold;
unsigned int fb_id;
enum plane plane;
Expand Down
8 changes: 4 additions & 4 deletions drivers/gpu/drm/i915/i915_gem_stolen.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ static int i915_setup_compression(struct drm_device *dev, int size, int fb_cpp)
dev_priv->mm.stolen_base + compressed_llb->start);
}

dev_priv->fbc.size = size / dev_priv->fbc.threshold;
dev_priv->fbc.uncompressed_size = size;

DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
size);
Expand All @@ -253,7 +253,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, int fb_c
if (!drm_mm_initialized(&dev_priv->mm.stolen))
return -ENODEV;

if (size < dev_priv->fbc.size)
if (size < dev_priv->fbc.uncompressed_size)
return 0;

/* Release any current block */
Expand All @@ -266,7 +266,7 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;

if (dev_priv->fbc.size == 0)
if (dev_priv->fbc.uncompressed_size == 0)
return;

drm_mm_remove_node(&dev_priv->fbc.compressed_fb);
Expand All @@ -276,7 +276,7 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
kfree(dev_priv->fbc.compressed_llb);
}

dev_priv->fbc.size = 0;
dev_priv->fbc.uncompressed_size = 0;
}

void i915_gem_cleanup_stolen(struct drm_device *dev)
Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/i915/intel_fbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ static void i8xx_fbc_enable(struct drm_crtc *crtc)

dev_priv->fbc.enabled = true;

cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE;
/* Note: fbc.threshold == 1 for i8xx */
cfb_pitch = dev_priv->fbc.uncompressed_size / FBC_LL_SIZE;
if (fb->pitches[0] < cfb_pitch)
cfb_pitch = fb->pitches[0];

Expand Down

0 comments on commit 60ee5cd

Please sign in to comment.