aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-18 06:03:29 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-18 06:03:29 -0400
commit8157ee2115fc343ccdadab671e2b75e285feaa60 (patch)
tree52db40213970636590e74774ffd2efb55f0ee578 /drivers/gpu/drm
parent2e57f47d317dd035b18634b0c602272529368fcc (diff)
parent8bb495e3f02401ee6f76d1b1d77f3ac9f079e376 (diff)
Merge tag 'v3.10' into drm-intel-fixes
Backmerge Linux 3.10 to get at commit 19b2dbde5732170a03bd82cc8bd442cf88d856f7 Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Wed Jun 12 10:15:12 2013 +0100 drm/i915: Restore fences after resume and GPU resets That commit is not in my current -fixes pile since that's based on my -next queue for 3.11. And the above mentioned fix was merged really late into 3.10 (and blew up, bad me) so was on a diverging branch. Option B would have been to rebase my current pile of fixes onto Dave's drm-fixes branch. But since some of the patches here are a bit tricky I've decided not to void all the testing by moving over the entire merge window. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c22
-rw-r--r--drivers/gpu/drm/i915/i915_suspend.c1
-rw-r--r--drivers/gpu/drm/qxl/qxl_ioctl.c5
4 files changed, 13 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index cc1d6056ab70..a416645bcd23 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1806,6 +1806,8 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
1806struct dma_buf *i915_gem_prime_export(struct drm_device *dev, 1806struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
1807 struct drm_gem_object *gem_obj, int flags); 1807 struct drm_gem_object *gem_obj, int flags);
1808 1808
1809void i915_gem_restore_fences(struct drm_device *dev);
1810
1809/* i915_gem_context.c */ 1811/* i915_gem_context.c */
1810void i915_gem_context_init(struct drm_device *dev); 1812void i915_gem_context_init(struct drm_device *dev);
1811void i915_gem_context_fini(struct drm_device *dev); 1813void 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 06d66e09da17..97afd2639fb6 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2251,25 +2251,15 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
2251 } 2251 }
2252} 2252}
2253 2253
2254static void i915_gem_reset_fences(struct drm_device *dev) 2254void i915_gem_restore_fences(struct drm_device *dev)
2255{ 2255{
2256 struct drm_i915_private *dev_priv = dev->dev_private; 2256 struct drm_i915_private *dev_priv = dev->dev_private;
2257 int i; 2257 int i;
2258 2258
2259 for (i = 0; i < dev_priv->num_fence_regs; i++) { 2259 for (i = 0; i < dev_priv->num_fence_regs; i++) {
2260 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i]; 2260 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2261 2261 i915_gem_write_fence(dev, i, reg->obj);
2262 if (reg->obj)
2263 i915_gem_object_fence_lost(reg->obj);
2264
2265 i915_gem_write_fence(dev, i, NULL);
2266
2267 reg->pin_count = 0;
2268 reg->obj = NULL;
2269 INIT_LIST_HEAD(&reg->lru_list);
2270 } 2262 }
2271
2272 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
2273} 2263}
2274 2264
2275void i915_gem_reset(struct drm_device *dev) 2265void i915_gem_reset(struct drm_device *dev)
@@ -2292,8 +2282,7 @@ void i915_gem_reset(struct drm_device *dev)
2292 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; 2282 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
2293 } 2283 }
2294 2284
2295 /* The fence registers are invalidated so clear them out */ 2285 i915_gem_restore_fences(dev);
2296 i915_gem_reset_fences(dev);
2297} 2286}
2298 2287
2299/** 2288/**
@@ -4003,8 +3992,6 @@ i915_gem_idle(struct drm_device *dev)
4003 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 3992 if (!drm_core_check_feature(dev, DRIVER_MODESET))
4004 i915_gem_evict_everything(dev); 3993 i915_gem_evict_everything(dev);
4005 3994
4006 i915_gem_reset_fences(dev);
4007
4008 /* Hack! Don't let anybody do execbuf while we don't control the chip. 3995 /* Hack! Don't let anybody do execbuf while we don't control the chip.
4009 * We need to replace this with a semaphore, or something. 3996 * We need to replace this with a semaphore, or something.
4010 * And not confound mm.suspended! 3997 * And not confound mm.suspended!
@@ -4340,7 +4327,8 @@ i915_gem_load(struct drm_device *dev)
4340 dev_priv->num_fence_regs = 8; 4327 dev_priv->num_fence_regs = 8;
4341 4328
4342 /* Initialize fence registers to zero */ 4329 /* Initialize fence registers to zero */
4343 i915_gem_reset_fences(dev); 4330 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4331 i915_gem_restore_fences(dev);
4344 4332
4345 i915_gem_detect_bit_6_swizzle(dev); 4333 i915_gem_detect_bit_6_swizzle(dev);
4346 init_waitqueue_head(&dev_priv->pending_flip_queue); 4334 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 88b9a663944f..70db618989c4 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -394,6 +394,7 @@ int i915_restore_state(struct drm_device *dev)
394 394
395 mutex_lock(&dev->struct_mutex); 395 mutex_lock(&dev->struct_mutex);
396 396
397 i915_gem_restore_fences(dev);
397 i915_restore_display(dev); 398 i915_restore_display(dev);
398 399
399 if (!drm_core_check_feature(dev, DRIVER_MODESET)) { 400 if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
index a4b71b25fa53..a30f29425c21 100644
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
@@ -171,6 +171,11 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,
171 if (user_cmd.command_size > PAGE_SIZE - sizeof(union qxl_release_info)) 171 if (user_cmd.command_size > PAGE_SIZE - sizeof(union qxl_release_info))
172 return -EINVAL; 172 return -EINVAL;
173 173
174 if (!access_ok(VERIFY_READ,
175 (void *)(unsigned long)user_cmd.command,
176 user_cmd.command_size))
177 return -EFAULT;
178
174 ret = qxl_alloc_release_reserved(qdev, 179 ret = qxl_alloc_release_reserved(qdev,
175 sizeof(union qxl_release_info) + 180 sizeof(union qxl_release_info) +
176 user_cmd.command_size, 181 user_cmd.command_size,