summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-07-10 19:10:59 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-07-10 19:10:59 -0700
commitbb8ad2815a1210bfa56b8f8ebf0e40fbdf9198ff (patch)
tree02875ebcc5f17f14858e1e960def698986b5d3d6 /drivers/gpu/drm/i915/i915_gem.c
parentc368b4921bc6e309aba2fbee0efcbbc965008d9f (diff)
parent5019914ca3b7517b2d82db2e92e3f683ac48e535 (diff)
downloadop-kernel-dev-bb8ad2815a1210bfa56b8f8ebf0e40fbdf9198ff.zip
op-kernel-dev-bb8ad2815a1210bfa56b8f8ebf0e40fbdf9198ff.tar.gz
Merge branch 'drm-intel-next' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel
* 'drm-intel-next' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel: (22 commits) drm/i915: Fix for LVDS VBT change on IGDNG drm/i915: Zap the GTT mapping when transitioning from untiled to tiled. drm/i915: Refactor calls to unmap_mapping_range drm/i915: Avoid saving/restore the modesetting registers twice in KMS mode drm: Disable the unused connectors explicitly when resuming with KMS. drm/i915: Restore the KMS modeset for every activated CRTC drm/i915: Fix harmless warning from patch merged after i2c rework. drm/i915: Disable GEM when a broken video BIOS takes up the whole aperture. drm/i915: Check the LID device to decide whether the LVDS should be initialized drm/i915: Move lock to more reasonable location drm/i915: Add gtt_offset to gem object list debugfs output drm/i915: Remove gtt_bound from drm_i915_gem_object drm/i915: Disable VGA output when doing DRM_MODE_DPMS_OFF. drm/i915: crt fetch EDID by DVI-I converter on G4x platform drm/i915: Don't update display FIFO watermark on IGDNG drm/i915: Adjust DisplayPort clocks to use 96MHz reference drm/i915: Make driver less chatty drm/i915: fix up a raw 64bit divide drm/i915: enable sdvo lvds scaling function. drm/i915: Set SSC frequency for 8xx chips correctly ...
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 876b65c..5bf4203 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1252,6 +1252,31 @@ out_free_list:
return ret;
}
+/**
+ * i915_gem_release_mmap - remove physical page mappings
+ * @obj: obj in question
+ *
+ * Preserve the reservation of the mmaping with the DRM core code, but
+ * relinquish ownership of the pages back to the system.
+ *
+ * It is vital that we remove the page mapping if we have mapped a tiled
+ * object through the GTT and then lose the fence register due to
+ * resource pressure. Similarly if the object has been moved out of the
+ * aperture, than pages mapped into userspace must be revoked. Removing the
+ * mapping will then trigger a page fault on the next user access, allowing
+ * fixup by i915_gem_fault().
+ */
+void
+i915_gem_release_mmap(struct drm_gem_object *obj)
+{
+ struct drm_device *dev = obj->dev;
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+
+ if (dev->dev_mapping)
+ unmap_mapping_range(dev->dev_mapping,
+ obj_priv->mmap_offset, obj->size, 1);
+}
+
static void
i915_gem_free_mmap_offset(struct drm_gem_object *obj)
{
@@ -1861,7 +1886,6 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
struct drm_i915_gem_object *obj_priv = obj->driver_private;
- loff_t offset;
int ret = 0;
#if WATCH_BUF
@@ -1898,9 +1922,7 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
BUG_ON(obj_priv->active);
/* blow away mappings if mapped through GTT */
- offset = ((loff_t) obj->map_list.hash.key) << PAGE_SHIFT;
- if (dev->dev_mapping)
- unmap_mapping_range(dev->dev_mapping, offset, obj->size, 1);
+ i915_gem_release_mmap(obj);
if (obj_priv->fence_reg != I915_FENCE_REG_NONE)
i915_gem_clear_fence_reg(obj);
@@ -2222,7 +2244,6 @@ try_again:
/* None available, try to steal one or wait for a user to finish */
if (i == dev_priv->num_fence_regs) {
uint32_t seqno = dev_priv->mm.next_gem_seqno;
- loff_t offset;
if (avail == 0)
return -ENOSPC;
@@ -2274,10 +2295,7 @@ try_again:
* Zap this virtual mapping so we can set up a fence again
* for this object next time we need it.
*/
- offset = ((loff_t) reg->obj->map_list.hash.key) << PAGE_SHIFT;
- if (dev->dev_mapping)
- unmap_mapping_range(dev->dev_mapping, offset,
- reg->obj->size, 1);
+ i915_gem_release_mmap(reg->obj);
old_obj_priv->fence_reg = I915_FENCE_REG_NONE;
}
OpenPOWER on IntegriCloud