]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/i915/i915_gem_execbuffer.c
drm/i915/tracepoints: Adjust i915_gem_ring_dispatch
[linux.git] / drivers / gpu / drm / i915 / i915_gem_execbuffer.c
index 91c2393199a316c9f1487a45073df21731d767df..dfed503301a652c253cf8ae5544635a17506b6d7 100644 (file)
@@ -437,12 +437,11 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
                                               PIN_MAPPABLE | PIN_NONBLOCK);
                if (IS_ERR(vma)) {
                        memset(&cache->node, 0, sizeof(cache->node));
-                       ret = drm_mm_insert_node_in_range_generic
+                       ret = drm_mm_insert_node_in_range
                                (&ggtt->base.mm, &cache->node,
                                 PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
                                 0, ggtt->mappable_end,
-                                DRM_MM_SEARCH_DEFAULT,
-                                DRM_MM_CREATE_DEFAULT);
+                                DRM_MM_INSERT_LOW);
                        if (ret) /* no inactive aperture space, use cpu reloc */
                                return NULL;
                } else {
@@ -1185,14 +1184,14 @@ validate_exec_list(struct drm_device *dev,
                        if (exec[i].offset !=
                            gen8_canonical_addr(exec[i].offset & PAGE_MASK))
                                return -EINVAL;
-
-                       /* From drm_mm perspective address space is continuous,
-                        * so from this point we're always using non-canonical
-                        * form internally.
-                        */
-                       exec[i].offset = gen8_noncanonical_addr(exec[i].offset);
                }
 
+               /* From drm_mm perspective address space is continuous,
+                * so from this point we're always using non-canonical
+                * form internally.
+                */
+               exec[i].offset = gen8_noncanonical_addr(exec[i].offset);
+
                if (exec[i].alignment && !is_power_of_2(exec[i].alignment))
                        return -EINVAL;
 
@@ -1302,12 +1301,12 @@ static void eb_export_fence(struct drm_i915_gem_object *obj,
         * handle an error right now. Worst case should be missed
         * synchronisation leading to rendering corruption.
         */
-       ww_mutex_lock(&resv->lock, NULL);
+       reservation_object_lock(resv, NULL);
        if (flags & EXEC_OBJECT_WRITE)
                reservation_object_add_excl_fence(resv, &req->fence);
        else if (reservation_object_reserve_shared(resv) == 0)
                reservation_object_add_shared_fence(resv, &req->fence);
-       ww_mutex_unlock(&resv->lock);
+       reservation_object_unlock(resv);
 }
 
 static void
@@ -1337,25 +1336,25 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
 static int
 i915_reset_gen7_sol_offsets(struct drm_i915_gem_request *req)
 {
-       struct intel_ring *ring = req->ring;
-       int ret, i;
+       u32 *cs;
+       int i;
 
        if (!IS_GEN7(req->i915) || req->engine->id != RCS) {
                DRM_DEBUG("sol reset is gen7/rcs only\n");
                return -EINVAL;
        }
 
-       ret = intel_ring_begin(req, 4 * 3);
-       if (ret)
-               return ret;
+       cs = intel_ring_begin(req, 4 * 3);
+       if (IS_ERR(cs))
+               return PTR_ERR(cs);
 
        for (i = 0; i < 4; i++) {
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, GEN7_SO_WRITE_OFFSET(i));
-               intel_ring_emit(ring, 0);
+               *cs++ = MI_LOAD_REGISTER_IMM(1);
+               *cs++ = i915_mmio_reg_offset(GEN7_SO_WRITE_OFFSET(i));
+               *cs++ = 0;
        }
 
-       intel_ring_advance(ring);
+       intel_ring_advance(req, cs);
 
        return 0;
 }
@@ -1416,7 +1415,7 @@ execbuf_submit(struct i915_execbuffer_params *params,
        struct drm_i915_private *dev_priv = params->request->i915;
        u64 exec_start, exec_len;
        int instp_mode;
-       u32 instp_mask;
+       u32 instp_mask, *cs;
        int ret;
 
        ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas);
@@ -1462,17 +1461,15 @@ execbuf_submit(struct i915_execbuffer_params *params,
 
        if (params->engine->id == RCS &&
            instp_mode != dev_priv->relative_constants_mode) {
-               struct intel_ring *ring = params->request->ring;
+               cs = intel_ring_begin(params->request, 4);
+               if (IS_ERR(cs))
+                       return PTR_ERR(cs);
 
-               ret = intel_ring_begin(params->request, 4);
-               if (ret)
-                       return ret;
-
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, INSTPM);
-               intel_ring_emit(ring, instp_mask << 16 | instp_mode);
-               intel_ring_advance(ring);
+               *cs++ = MI_NOOP;
+               *cs++ = MI_LOAD_REGISTER_IMM(1);
+               *cs++ = i915_mmio_reg_offset(INSTPM);
+               *cs++ = instp_mask << 16 | instp_mode;
+               intel_ring_advance(params->request, cs);
 
                dev_priv->relative_constants_mode = instp_mode;
        }
@@ -1496,8 +1493,6 @@ execbuf_submit(struct i915_execbuffer_params *params,
        if (ret)
                return ret;
 
-       trace_i915_gem_ring_dispatch(params->request, params->dispatch_flags);
-
        i915_gem_execbuffer_move_to_active(vmas, params->request);
 
        return 0;
@@ -1644,18 +1639,15 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
        if (args->flags & I915_EXEC_FENCE_IN) {
                in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
-               if (!in_fence) {
-                       ret = -EINVAL;
-                       goto pre_mutex_err;
-               }
+               if (!in_fence)
+                       return -EINVAL;
        }
 
        if (args->flags & I915_EXEC_FENCE_OUT) {
                out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
                if (out_fence_fd < 0) {
                        ret = out_fence_fd;
-                       out_fence_fd = -1;
-                       goto pre_mutex_err;
+                       goto err_in_fence;
                }
        }
 
@@ -1842,6 +1834,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        params->dispatch_flags          = dispatch_flags;
        params->ctx                     = ctx;
 
+       trace_i915_gem_request_queue(params->request, dispatch_flags);
+
        ret = execbuf_submit(params, args, &eb->vmas);
 err_request:
        __i915_add_request(params->request, ret == 0);
@@ -1878,6 +1872,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        intel_runtime_pm_put(dev_priv);
        if (out_fence_fd != -1)
                put_unused_fd(out_fence_fd);
+err_in_fence:
        dma_fence_put(in_fence);
        return ret;
 }