diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-27 01:23:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-27 01:23:15 -0400 |
commit | 1a506e473576cdcb922d339aea76b67d0fe344f7 (patch) | |
tree | a92289ddf4a7480dd75328321be9c421da74a959 | |
parent | 34a08681832f835269670b1d72e45f48b014375f (diff) | |
parent | 426729dcc713b3d1ae802e314030e5556a62da53 (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.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 37 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 1 |
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, | |||
1697 | struct dma_buf *i915_gem_prime_export(struct drm_device *dev, | 1697 | struct 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 | ||
1700 | void i915_gem_restore_fences(struct drm_device *dev); | ||
1701 | |||
1700 | /* i915_gem_context.c */ | 1702 | /* i915_gem_context.c */ |
1701 | void i915_gem_context_init(struct drm_device *dev); | 1703 | void i915_gem_context_init(struct drm_device *dev); |
1702 | void i915_gem_context_fini(struct drm_device *dev); | 1704 | void 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 | ||
2120 | static void i915_gem_reset_fences(struct drm_device *dev) | 2129 | void 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(®->lru_list); | ||
2136 | } | 2137 | } |
2137 | |||
2138 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); | ||
2139 | } | 2138 | } |
2140 | 2139 | ||
2141 | void i915_gem_reset(struct drm_device *dev) | 2140 | void 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)) { |