diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-18 06:03:29 -0400 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-07-18 06:03:29 -0400 |
| commit | 8157ee2115fc343ccdadab671e2b75e285feaa60 (patch) | |
| tree | 52db40213970636590e74774ffd2efb55f0ee578 /drivers/gpu/drm | |
| parent | 2e57f47d317dd035b18634b0c602272529368fcc (diff) | |
| parent | 8bb495e3f02401ee6f76d1b1d77f3ac9f079e376 (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.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 5 |
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, | |||
| 1806 | struct dma_buf *i915_gem_prime_export(struct drm_device *dev, | 1806 | struct 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 | ||
| 1809 | void i915_gem_restore_fences(struct drm_device *dev); | ||
| 1810 | |||
| 1809 | /* i915_gem_context.c */ | 1811 | /* i915_gem_context.c */ |
| 1810 | void i915_gem_context_init(struct drm_device *dev); | 1812 | void i915_gem_context_init(struct drm_device *dev); |
| 1811 | void i915_gem_context_fini(struct drm_device *dev); | 1813 | 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 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 | ||
| 2254 | static void i915_gem_reset_fences(struct drm_device *dev) | 2254 | void 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(®->lru_list); | ||
| 2270 | } | 2262 | } |
| 2271 | |||
| 2272 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); | ||
| 2273 | } | 2263 | } |
| 2274 | 2264 | ||
| 2275 | void i915_gem_reset(struct drm_device *dev) | 2265 | void 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, |
