aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-06-27 01:23:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-06-27 01:23:15 -0400
commit1a506e473576cdcb922d339aea76b67d0fe344f7 (patch)
treea92289ddf4a7480dd75328321be9c421da74a959
parent34a08681832f835269670b1d72e45f48b014375f (diff)
parent426729dcc713b3d1ae802e314030e5556a62da53 (diff)
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull i915 drm fixes from Dave Airlie: "These should be the last two fixes for i915, one is for a fence leak killing X on some older GPUs, and one is a late regression partial revert for an swiotlb/xen/i915 interaction, Konrad has promised to figure out the proper answer, and this patch is the best thing to do at this stage to avoid regressing" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/i915: make compact dma scatter lists creation work with SWIOTLB backend. drm/i915: Restore fences after resume and GPU resets
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c37
-rw-r--r--drivers/gpu/drm/i915/i915_suspend.c1
3 files changed, 20 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index b9d00dcf9a2d..9669a0b8b440 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1697,6 +1697,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
1697struct dma_buf *i915_gem_prime_export(struct drm_device *dev, 1697struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
1698 struct drm_gem_object *gem_obj, int flags); 1698 struct drm_gem_object *gem_obj, int flags);
1699 1699
1700void i915_gem_restore_fences(struct drm_device *dev);
1701
1700/* i915_gem_context.c */ 1702/* i915_gem_context.c */
1701void i915_gem_context_init(struct drm_device *dev); 1703void i915_gem_context_init(struct drm_device *dev);
1702void i915_gem_context_fini(struct drm_device *dev); 1704void i915_gem_context_fini(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 970ad17c99ab..9e35dafc5807 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1801,7 +1801,14 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
1801 gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD; 1801 gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
1802 gfp &= ~(__GFP_IO | __GFP_WAIT); 1802 gfp &= ~(__GFP_IO | __GFP_WAIT);
1803 } 1803 }
1804 1804#ifdef CONFIG_SWIOTLB
1805 if (swiotlb_nr_tbl()) {
1806 st->nents++;
1807 sg_set_page(sg, page, PAGE_SIZE, 0);
1808 sg = sg_next(sg);
1809 continue;
1810 }
1811#endif
1805 if (!i || page_to_pfn(page) != last_pfn + 1) { 1812 if (!i || page_to_pfn(page) != last_pfn + 1) {
1806 if (i) 1813 if (i)
1807 sg = sg_next(sg); 1814 sg = sg_next(sg);
@@ -1812,8 +1819,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
1812 } 1819 }
1813 last_pfn = page_to_pfn(page); 1820 last_pfn = page_to_pfn(page);
1814 } 1821 }
1815 1822#ifdef CONFIG_SWIOTLB
1816 sg_mark_end(sg); 1823 if (!swiotlb_nr_tbl())
1824#endif
1825 sg_mark_end(sg);
1817 obj->pages = st; 1826 obj->pages = st;
1818 1827
1819 if (i915_gem_object_needs_bit17_swizzle(obj)) 1828 if (i915_gem_object_needs_bit17_swizzle(obj))
@@ -2117,25 +2126,15 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
2117 } 2126 }
2118} 2127}
2119 2128
2120static void i915_gem_reset_fences(struct drm_device *dev) 2129void i915_gem_restore_fences(struct drm_device *dev)
2121{ 2130{
2122 struct drm_i915_private *dev_priv = dev->dev_private; 2131 struct drm_i915_private *dev_priv = dev->dev_private;
2123 int i; 2132 int i;
2124 2133
2125 for (i = 0; i < dev_priv->num_fence_regs; i++) { 2134 for (i = 0; i < dev_priv->num_fence_regs; i++) {
2126 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i]; 2135 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2127 2136 i915_gem_write_fence(dev, i, reg->obj);
2128 if (reg->obj)
2129 i915_gem_object_fence_lost(reg->obj);
2130
2131 i915_gem_write_fence(dev, i, NULL);
2132
2133 reg->pin_count = 0;
2134 reg->obj = NULL;
2135 INIT_LIST_HEAD(&reg->lru_list);
2136 } 2137 }
2137
2138 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
2139} 2138}
2140 2139
2141void i915_gem_reset(struct drm_device *dev) 2140void i915_gem_reset(struct drm_device *dev)
@@ -2158,8 +2157,7 @@ void i915_gem_reset(struct drm_device *dev)
2158 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; 2157 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
2159 } 2158 }
2160 2159
2161 /* The fence registers are invalidated so clear them out */ 2160 i915_gem_restore_fences(dev);
2162 i915_gem_reset_fences(dev);
2163} 2161}
2164 2162
2165/** 2163/**
@@ -3865,8 +3863,6 @@ i915_gem_idle(struct drm_device *dev)
3865 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 3863 if (!drm_core_check_feature(dev, DRIVER_MODESET))
3866 i915_gem_evict_everything(dev); 3864 i915_gem_evict_everything(dev);
3867 3865
3868 i915_gem_reset_fences(dev);
3869
3870 /* Hack! Don't let anybody do execbuf while we don't control the chip. 3866 /* Hack! Don't let anybody do execbuf while we don't control the chip.
3871 * We need to replace this with a semaphore, or something. 3867 * We need to replace this with a semaphore, or something.
3872 * And not confound mm.suspended! 3868 * And not confound mm.suspended!
@@ -4193,7 +4189,8 @@ i915_gem_load(struct drm_device *dev)
4193 dev_priv->num_fence_regs = 8; 4189 dev_priv->num_fence_regs = 8;
4194 4190
4195 /* Initialize fence registers to zero */ 4191 /* Initialize fence registers to zero */
4196 i915_gem_reset_fences(dev); 4192 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4193 i915_gem_restore_fences(dev);
4197 4194
4198 i915_gem_detect_bit_6_swizzle(dev); 4195 i915_gem_detect_bit_6_swizzle(dev);
4199 init_waitqueue_head(&dev_priv->pending_flip_queue); 4196 init_waitqueue_head(&dev_priv->pending_flip_queue);
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
index 41f0fdecfbdc..369b3d8776ab 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -384,6 +384,7 @@ int i915_restore_state(struct drm_device *dev)
384 384
385 mutex_lock(&dev->struct_mutex); 385 mutex_lock(&dev->struct_mutex);
386 386
387 i915_gem_restore_fences(dev);
387 i915_restore_display(dev); 388 i915_restore_display(dev);
388 389
389 if (!drm_core_check_feature(dev, DRIVER_MODESET)) { 390 if (!drm_core_check_feature(dev, DRIVER_MODESET)) {