drm/i915: Make intel_display_suspend atomic, try 2.
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_gem_execbuffer.c
index 9968c02f76f33db10cf1d9d2d022f5e6f81a2b89..83577c6159624230ea70ec4bc6f9f5214fa1c504 100644 (file)
@@ -924,7 +924,7 @@ i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req,
        /* Unconditionally invalidate gpu caches and ensure that we do flush
         * any residual writes from the previous batch.
         */
-       return intel_ring_invalidate_all_caches(req->ring);
+       return intel_ring_invalidate_all_caches(req);
 }
 
 static bool
@@ -1036,7 +1036,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
                        obj->base.pending_read_domains |= obj->base.read_domains;
                obj->base.read_domains = obj->base.pending_read_domains;
 
-               i915_vma_move_to_active(vma, ring);
+               i915_vma_move_to_active(vma, req);
                if (obj->base.write_domain) {
                        obj->dirty = 1;
                        i915_gem_request_assign(&obj->last_write_req, req);
@@ -1066,13 +1066,14 @@ i915_gem_execbuffer_retire_commands(struct i915_execbuffer_params *params)
        params->ring->gpu_caches_dirty = true;
 
        /* Add a breadcrumb for the completion of the batch buffer */
-       __i915_add_request(params->ring, params->file, params->batch_obj, true);
+       __i915_add_request(params->request, params->batch_obj, true);
 }
 
 static int
 i915_reset_gen7_sol_offsets(struct drm_device *dev,
-                           struct intel_engine_cs *ring)
+                           struct drm_i915_gem_request *req)
 {
+       struct intel_engine_cs *ring = req->ring;
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret, i;
 
@@ -1081,7 +1082,7 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
                return -EINVAL;
        }
 
-       ret = intel_ring_begin(ring, 4 * 3);
+       ret = intel_ring_begin(req, 4 * 3);
        if (ret)
                return ret;
 
@@ -1097,10 +1098,11 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
 }
 
 static int
-i915_emit_box(struct intel_engine_cs *ring,
+i915_emit_box(struct drm_i915_gem_request *req,
              struct drm_clip_rect *box,
              int DR1, int DR4)
 {
+       struct intel_engine_cs *ring = req->ring;
        int ret;
 
        if (box->y2 <= box->y1 || box->x2 <= box->x1 ||
@@ -1111,7 +1113,7 @@ i915_emit_box(struct intel_engine_cs *ring,
        }
 
        if (INTEL_INFO(ring->dev)->gen >= 4) {
-               ret = intel_ring_begin(ring, 4);
+               ret = intel_ring_begin(req, 4);
                if (ret)
                        return ret;
 
@@ -1120,7 +1122,7 @@ i915_emit_box(struct intel_engine_cs *ring,
                intel_ring_emit(ring, ((box->x2 - 1) & 0xffff) | (box->y2 - 1) << 16);
                intel_ring_emit(ring, DR4);
        } else {
-               ret = intel_ring_begin(ring, 6);
+               ret = intel_ring_begin(req, 6);
                if (ret)
                        return ret;
 
@@ -1296,7 +1298,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
 
        if (ring == &dev_priv->ring[RCS] &&
                        instp_mode != dev_priv->relative_constants_mode) {
-               ret = intel_ring_begin(ring, 4);
+               ret = intel_ring_begin(params->request, 4);
                if (ret)
                        goto error;
 
@@ -1310,7 +1312,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
        }
 
        if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
-               ret = i915_reset_gen7_sol_offsets(dev, ring);
+               ret = i915_reset_gen7_sol_offsets(dev, params->request);
                if (ret)
                        goto error;
        }
@@ -1321,19 +1323,19 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
 
        if (cliprects) {
                for (i = 0; i < args->num_cliprects; i++) {
-                       ret = i915_emit_box(ring, &cliprects[i],
+                       ret = i915_emit_box(params->request, &cliprects[i],
                                            args->DR1, args->DR4);
                        if (ret)
                                goto error;
 
-                       ret = ring->dispatch_execbuffer(ring,
+                       ret = ring->dispatch_execbuffer(params->request,
                                                        exec_start, exec_len,
                                                        params->dispatch_flags);
                        if (ret)
                                goto error;
                }
        } else {
-               ret = ring->dispatch_execbuffer(ring,
+               ret = ring->dispatch_execbuffer(params->request,
                                                exec_start, exec_len,
                                                params->dispatch_flags);
                if (ret)
@@ -1488,6 +1490,20 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
+       if (args->flags & I915_EXEC_RESOURCE_STREAMER) {
+               if (!HAS_RESOURCE_STREAMER(dev)) {
+                       DRM_DEBUG("RS is only allowed for Haswell, Gen8 and above\n");
+                       return -EINVAL;
+               }
+               if (ring->id != RCS) {
+                       DRM_DEBUG("RS is not available on %s\n",
+                                ring->name);
+                       return -EINVAL;
+               }
+
+               dispatch_flags |= I915_DISPATCH_RS;
+       }
+
        intel_runtime_pm_get(dev_priv);
 
        ret = i915_mutex_lock_interruptible(dev);
@@ -1618,6 +1634,10 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        if (ret)
                goto err_batch_unpin;
 
+       ret = i915_gem_request_add_to_client(params->request, file);
+       if (ret)
+               goto err_batch_unpin;
+
        /*
         * Save assorted stuff away to pass through to *_submission().
         * NB: This data should be 'persistent' and not local as it will
@@ -1653,10 +1673,8 @@ err:
         * must be freed again. If it was submitted then it is being tracked
         * on the active request list and no clean up is required here.
         */
-       if (ret && params->request) {
+       if (ret && params->request)
                i915_gem_request_cancel(params->request);
-               ring->outstanding_lazy_request = NULL;
-       }
 
        mutex_unlock(&dev->struct_mutex);
 
This page took 0.035166 seconds and 5 git commands to generate.