summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_dma.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-05-13 00:27:36 +0200
committerEric Anholt <eric@anholt.net>2009-05-15 01:00:20 +0200
commit13f4c435ebf2a7c150ffa714f3b23b8e4e8cb42f (patch)
tree8cf39be40bc83d5426497522e393e26901261e8c /drivers/gpu/drm/i915/i915_dma.c
parentdrm/i915: save/restore fence registers across suspend/resume (diff)
downloadlinux-13f4c435ebf2a7c150ffa714f3b23b8e4e8cb42f.tar.xz
linux-13f4c435ebf2a7c150ffa714f3b23b8e4e8cb42f.zip
drm/i915: Don't allow binding objects into the last page of the aperture.
This should avoid a class of bugs where the hardware prefetches past the end of the object, and walks into unallocated memory when the object is bound to the last page of the aperture. fd.o bug #21488 Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to '')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 051134c56aef..3133f991968d 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1011,8 +1011,16 @@ static int i915_load_modeset_init(struct drm_device *dev)
/* Basic memrange allocator for stolen space (aka vram) */
drm_mm_init(&dev_priv->vram, 0, prealloc_size);
- /* Let GEM Manage from end of prealloc space to end of aperture */
- i915_gem_do_init(dev, prealloc_size, agp_size);
+ /* Let GEM Manage from end of prealloc space to end of aperture.
+ *
+ * However, leave one page at the end still bound to the scratch page.
+ * There are a number of places where the hardware apparently
+ * prefetches past the end of the object, and we've seen multiple
+ * hangs with the GPU head pointer stuck in a batchbuffer bound
+ * at the last page of the aperture. One page should be enough to
+ * keep any prefetching inside of the aperture.
+ */
+ i915_gem_do_init(dev, prealloc_size, agp_size - 4096);
ret = i915_gem_init_ringbuffer(dev);
if (ret)