Merge branch 'drm-intel-next' of git://people.freedesktop.org/~danvet/drm-intel into...
[linux-2.6-block.git] / drivers / gpu / drm / i915 / i915_dma.c
index 4636391ded38bf457a810cbef6c136d5063bfa71..652f43f00ef2b7405eeb43312edf5c1cc7c47e35 100644 (file)
@@ -1189,6 +1189,21 @@ static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
        return can_switch;
 }
 
+static bool
+intel_enable_ppgtt(struct drm_device *dev)
+{
+       if (i915_enable_ppgtt >= 0)
+               return i915_enable_ppgtt;
+
+#ifdef CONFIG_INTEL_IOMMU
+       /* Disable ppgtt on SNB if VT-d is on. */
+       if (INTEL_INFO(dev)->gen == 6 && intel_iommu_gfx_mapped)
+               return false;
+#endif
+
+       return true;
+}
+
 static int i915_load_gem_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1203,7 +1218,7 @@ static int i915_load_gem_init(struct drm_device *dev)
        drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size);
 
        mutex_lock(&dev->struct_mutex);
-       if (i915_enable_ppgtt && HAS_ALIASING_PPGTT(dev)) {
+       if (intel_enable_ppgtt(dev) && HAS_ALIASING_PPGTT(dev)) {
                /* PPGTT pdes are stolen from global gtt ptes, so shrink the
                 * aperture accordingly when using aliasing ppgtt. */
                gtt_size -= I915_PPGTT_PD_ENTRIES*PAGE_SIZE;
@@ -1211,8 +1226,10 @@ static int i915_load_gem_init(struct drm_device *dev)
                i915_gem_init_global_gtt(dev, 0, mappable_size, gtt_size);
 
                ret = i915_gem_init_aliasing_ppgtt(dev);
-               if (ret)
+               if (ret) {
+                       mutex_unlock(&dev->struct_mutex);
                        return ret;
+               }
        } else {
                /* Let GEM Manage all of the aperture.
                 *