drm/i915: Drop the CONTEXT_CLONE API (v2)
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gem / i915_gem_context.c
index fd8ee52..9f9369d 100644 (file)
@@ -211,8 +211,7 @@ static void intel_context_set_gem(struct intel_context *ce,
        GEM_BUG_ON(rcu_access_pointer(ce->gem_context));
        RCU_INIT_POINTER(ce->gem_context, ctx);
 
-       if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags))
-               ce->ring = __intel_context_ring_size(SZ_16K);
+       ce->ring_size = SZ_16K;
 
        if (rcu_access_pointer(ctx->vm)) {
                struct i915_address_space *vm;
@@ -233,7 +232,12 @@ static void intel_context_set_gem(struct intel_context *ce,
            intel_engine_has_timeslices(ce->engine))
                __set_bit(CONTEXT_USE_SEMAPHORES, &ce->flags);
 
-       intel_context_set_watchdog_us(ce, ctx->watchdog.timeout_us);
+       if (IS_ACTIVE(CONFIG_DRM_I915_REQUEST_TIMEOUT) &&
+           ctx->i915->params.request_timeout_ms) {
+               unsigned int timeout_ms = ctx->i915->params.request_timeout_ms;
+
+               intel_context_set_watchdog_us(ce, (u64)timeout_ms * 1000);
+       }
 }
 
 static void __free_engines(struct i915_gem_engines *e, unsigned int count)
@@ -714,32 +718,25 @@ __context_engines_await(const struct i915_gem_context *ctx,
        return engines;
 }
 
-static int
+static void
 context_apply_all(struct i915_gem_context *ctx,
-                 int (*fn)(struct intel_context *ce, void *data),
+                 void (*fn)(struct intel_context *ce, void *data),
                  void *data)
 {
        struct i915_gem_engines_iter it;
        struct i915_gem_engines *e;
        struct intel_context *ce;
-       int err = 0;
 
        e = __context_engines_await(ctx, NULL);
-       for_each_gem_engine(ce, e, it) {
-               err = fn(ce, data);
-               if (err)
-                       break;
-       }
+       for_each_gem_engine(ce, e, it)
+               fn(ce, data);
        i915_sw_fence_complete(&e->fence);
-
-       return err;
 }
 
-static int __apply_ppgtt(struct intel_context *ce, void *vm)
+static void __apply_ppgtt(struct intel_context *ce, void *vm)
 {
        i915_vm_put(ce->vm);
        ce->vm = i915_vm_get(vm);
-       return 0;
 }
 
 static struct i915_address_space *
@@ -779,10 +776,9 @@ static void __set_timeline(struct intel_timeline **dst,
                intel_timeline_put(old);
 }
 
-static int __apply_timeline(struct intel_context *ce, void *timeline)
+static void __apply_timeline(struct intel_context *ce, void *timeline)
 {
        __set_timeline(&ce->timeline, timeline);
-       return 0;
 }
 
 static void __assign_timeline(struct i915_gem_context *ctx,
@@ -792,41 +788,6 @@ static void __assign_timeline(struct i915_gem_context *ctx,
        context_apply_all(ctx, __apply_timeline, timeline);
 }
 
-static int __apply_watchdog(struct intel_context *ce, void *timeout_us)
-{
-       return intel_context_set_watchdog_us(ce, (uintptr_t)timeout_us);
-}
-
-static int
-__set_watchdog(struct i915_gem_context *ctx, unsigned long timeout_us)
-{
-       int ret;
-
-       ret = context_apply_all(ctx, __apply_watchdog,
-                               (void *)(uintptr_t)timeout_us);
-       if (!ret)
-               ctx->watchdog.timeout_us = timeout_us;
-
-       return ret;
-}
-
-static void __set_default_fence_expiry(struct i915_gem_context *ctx)
-{
-       struct drm_i915_private *i915 = ctx->i915;
-       int ret;
-
-       if (!IS_ACTIVE(CONFIG_DRM_I915_REQUEST_TIMEOUT) ||
-           !i915->params.request_timeout_ms)
-               return;
-
-       /* Default expiry for user fences. */
-       ret = __set_watchdog(ctx, i915->params.request_timeout_ms * 1000);
-       if (ret)
-               drm_notice(&i915->drm,
-                          "Failed to configure default fence expiry! (%d)",
-                          ret);
-}
-
 static struct i915_gem_context *
 i915_gem_create_context(struct drm_i915_private *i915, unsigned int flags)
 {
@@ -871,8 +832,6 @@ i915_gem_create_context(struct drm_i915_private *i915, unsigned int flags)
                intel_timeline_put(timeline);
        }
 
-       __set_default_fence_expiry(ctx);
-
        trace_i915_context_create(ctx);
 
        return ctx;
@@ -1046,7 +1005,6 @@ struct context_barrier_task {
        void *data;
 };
 
-__i915_active_call
 static void cb_retire(struct i915_active *base)
 {
        struct context_barrier_task *cb = container_of(base, typeof(*cb), base);
@@ -1080,7 +1038,7 @@ static int context_barrier_task(struct i915_gem_context *ctx,
        if (!cb)
                return -ENOMEM;
 
-       i915_active_init(&cb->base, NULL, cb_retire);
+       i915_active_init(&cb->base, NULL, cb_retire, 0);
        err = i915_active_acquire(&cb->base);
        if (err) {
                kfree(cb);
@@ -1191,7 +1149,7 @@ static void set_ppgtt_barrier(void *data)
 {
        struct i915_address_space *old = data;
 
-       if (INTEL_GEN(old->i915) < 8)
+       if (GRAPHICS_VER(old->i915) < 8)
                gen6_ppgtt_unpin_all(i915_vm_to_ppgtt(old));
 
        i915_vm_close(old);
@@ -1335,63 +1293,6 @@ out:
        return err;
 }
 
-static int __apply_ringsize(struct intel_context *ce, void *sz)
-{
-       return intel_context_set_ring_size(ce, (unsigned long)sz);
-}
-
-static int set_ringsize(struct i915_gem_context *ctx,
-                       struct drm_i915_gem_context_param *args)
-{
-       if (!HAS_LOGICAL_RING_CONTEXTS(ctx->i915))
-               return -ENODEV;
-
-       if (args->size)
-               return -EINVAL;
-
-       if (!IS_ALIGNED(args->value, I915_GTT_PAGE_SIZE))
-               return -EINVAL;
-
-       if (args->value < I915_GTT_PAGE_SIZE)
-               return -EINVAL;
-
-       if (args->value > 128 * I915_GTT_PAGE_SIZE)
-               return -EINVAL;
-
-       return context_apply_all(ctx,
-                                __apply_ringsize,
-                                __intel_context_ring_size(args->value));
-}
-
-static int __get_ringsize(struct intel_context *ce, void *arg)
-{
-       long sz;
-
-       sz = intel_context_get_ring_size(ce);
-       GEM_BUG_ON(sz > INT_MAX);
-
-       return sz; /* stop on first engine */
-}
-
-static int get_ringsize(struct i915_gem_context *ctx,
-                       struct drm_i915_gem_context_param *args)
-{
-       int sz;
-
-       if (!HAS_LOGICAL_RING_CONTEXTS(ctx->i915))
-               return -ENODEV;
-
-       if (args->size)
-               return -EINVAL;
-
-       sz = context_apply_all(ctx, __get_ringsize, NULL);
-       if (sz < 0)
-               return sz;
-
-       args->value = sz;
-       return 0;
-}
-
 int
 i915_gem_user_to_context_sseu(struct intel_gt *gt,
                              const struct drm_i915_gem_context_param_sseu *user,
@@ -1437,7 +1338,7 @@ i915_gem_user_to_context_sseu(struct intel_gt *gt,
        context->max_eus_per_subslice = user->max_eus_per_subslice;
 
        /* Part specific restrictions. */
-       if (IS_GEN(i915, 11)) {
+       if (GRAPHICS_VER(i915) == 11) {
                unsigned int hw_s = hweight8(device->slice_mask);
                unsigned int hw_ss_per_s = hweight8(device->subslice_mask[0]);
                unsigned int req_s = hweight8(context->slice_mask);
@@ -1504,7 +1405,7 @@ static int set_sseu(struct i915_gem_context *ctx,
        if (args->size < sizeof(user_sseu))
                return -EINVAL;
 
-       if (!IS_GEN(i915, 11))
+       if (GRAPHICS_VER(i915) != 11)
                return -ENODEV;
 
        if (copy_from_user(&user_sseu, u64_to_user_ptr(args->value),
@@ -1932,19 +1833,17 @@ set_persistence(struct i915_gem_context *ctx,
        return __context_set_persistence(ctx, args->value);
 }
 
-static int __apply_priority(struct intel_context *ce, void *arg)
+static void __apply_priority(struct intel_context *ce, void *arg)
 {
        struct i915_gem_context *ctx = arg;
 
        if (!intel_engine_has_timeslices(ce->engine))
-               return 0;
+               return;
 
        if (ctx->sched.priority >= I915_PRIORITY_NORMAL)
                intel_context_set_use_semaphores(ce);
        else
                intel_context_clear_use_semaphores(ce);
-
-       return 0;
 }
 
 static int set_priority(struct i915_gem_context *ctx,
@@ -1979,15 +1878,6 @@ static int ctx_setparam(struct drm_i915_file_private *fpriv,
        int ret = 0;
 
        switch (args->param) {
-       case I915_CONTEXT_PARAM_NO_ZEROMAP:
-               if (args->size)
-                       ret = -EINVAL;
-               else if (args->value)
-                       set_bit(UCONTEXT_NO_ZEROMAP, &ctx->user_flags);
-               else
-                       clear_bit(UCONTEXT_NO_ZEROMAP, &ctx->user_flags);
-               break;
-
        case I915_CONTEXT_PARAM_NO_ERROR_CAPTURE:
                if (args->size)
                        ret = -EINVAL;
@@ -2037,11 +1927,9 @@ static int ctx_setparam(struct drm_i915_file_private *fpriv,
                ret = set_persistence(ctx, args);
                break;
 
-       case I915_CONTEXT_PARAM_RINGSIZE:
-               ret = set_ringsize(ctx, args);
-               break;
-
+       case I915_CONTEXT_PARAM_NO_ZEROMAP:
        case I915_CONTEXT_PARAM_BAN_PERIOD:
+       case I915_CONTEXT_PARAM_RINGSIZE:
        default:
                ret = -EINVAL;
                break;
@@ -2069,225 +1957,14 @@ static int create_setparam(struct i915_user_extension __user *ext, void *data)
        return ctx_setparam(arg->fpriv, arg->ctx, &local.param);
 }
 
-static int copy_ring_size(struct intel_context *dst,
-                         struct intel_context *src)
+static int invalid_ext(struct i915_user_extension __user *ext, void *data)
 {
-       long sz;
-
-       sz = intel_context_get_ring_size(src);
-       if (sz < 0)
-               return sz;
-
-       return intel_context_set_ring_size(dst, sz);
-}
-
-static int clone_engines(struct i915_gem_context *dst,
-                        struct i915_gem_context *src)
-{
-       struct i915_gem_engines *clone, *e;
-       bool user_engines;
-       unsigned long n;
-
-       e = __context_engines_await(src, &user_engines);
-       if (!e)
-               return -ENOENT;
-
-       clone = alloc_engines(e->num_engines);
-       if (!clone)
-               goto err_unlock;
-
-       for (n = 0; n < e->num_engines; n++) {
-               struct intel_engine_cs *engine;
-
-               if (!e->engines[n]) {
-                       clone->engines[n] = NULL;
-                       continue;
-               }
-               engine = e->engines[n]->engine;
-
-               /*
-                * Virtual engines are singletons; they can only exist
-                * inside a single context, because they embed their
-                * HW context... As each virtual context implies a single
-                * timeline (each engine can only dequeue a single request
-                * at any time), it would be surprising for two contexts
-                * to use the same engine. So let's create a copy of
-                * the virtual engine instead.
-                */
-               if (intel_engine_is_virtual(engine))
-                       clone->engines[n] =
-                               intel_execlists_clone_virtual(engine);
-               else
-                       clone->engines[n] = intel_context_create(engine);
-               if (IS_ERR_OR_NULL(clone->engines[n])) {
-                       __free_engines(clone, n);
-                       goto err_unlock;
-               }
-
-               intel_context_set_gem(clone->engines[n], dst);
-
-               /* Copy across the preferred ringsize */
-               if (copy_ring_size(clone->engines[n], e->engines[n])) {
-                       __free_engines(clone, n + 1);
-                       goto err_unlock;
-               }
-       }
-       clone->num_engines = n;
-       i915_sw_fence_complete(&e->fence);
-
-       /* Serialised by constructor */
-       engines_idle_release(dst, rcu_replace_pointer(dst->engines, clone, 1));
-       if (user_engines)
-               i915_gem_context_set_user_engines(dst);
-       else
-               i915_gem_context_clear_user_engines(dst);
-       return 0;
-
-err_unlock:
-       i915_sw_fence_complete(&e->fence);
-       return -ENOMEM;
-}
-
-static int clone_flags(struct i915_gem_context *dst,
-                      struct i915_gem_context *src)
-{
-       dst->user_flags = src->user_flags;
-       return 0;
-}
-
-static int clone_schedattr(struct i915_gem_context *dst,
-                          struct i915_gem_context *src)
-{
-       dst->sched = src->sched;
-       return 0;
-}
-
-static int clone_sseu(struct i915_gem_context *dst,
-                     struct i915_gem_context *src)
-{
-       struct i915_gem_engines *e = i915_gem_context_lock_engines(src);
-       struct i915_gem_engines *clone;
-       unsigned long n;
-       int err;
-
-       /* no locking required; sole access under constructor*/
-       clone = __context_engines_static(dst);
-       if (e->num_engines != clone->num_engines) {
-               err = -EINVAL;
-               goto unlock;
-       }
-
-       for (n = 0; n < e->num_engines; n++) {
-               struct intel_context *ce = e->engines[n];
-
-               if (clone->engines[n]->engine->class != ce->engine->class) {
-                       /* Must have compatible engine maps! */
-                       err = -EINVAL;
-                       goto unlock;
-               }
-
-               /* serialises with set_sseu */
-               err = intel_context_lock_pinned(ce);
-               if (err)
-                       goto unlock;
-
-               clone->engines[n]->sseu = ce->sseu;
-               intel_context_unlock_pinned(ce);
-       }
-
-       err = 0;
-unlock:
-       i915_gem_context_unlock_engines(src);
-       return err;
-}
-
-static int clone_timeline(struct i915_gem_context *dst,
-                         struct i915_gem_context *src)
-{
-       if (src->timeline)
-               __assign_timeline(dst, src->timeline);
-
-       return 0;
-}
-
-static int clone_vm(struct i915_gem_context *dst,
-                   struct i915_gem_context *src)
-{
-       struct i915_address_space *vm;
-       int err = 0;
-
-       if (!rcu_access_pointer(src->vm))
-               return 0;
-
-       rcu_read_lock();
-       vm = context_get_vm_rcu(src);
-       rcu_read_unlock();
-
-       if (!mutex_lock_interruptible(&dst->mutex)) {
-               __assign_ppgtt(dst, vm);
-               mutex_unlock(&dst->mutex);
-       } else {
-               err = -EINTR;
-       }
-
-       i915_vm_put(vm);
-       return err;
-}
-
-static int create_clone(struct i915_user_extension __user *ext, void *data)
-{
-       static int (* const fn[])(struct i915_gem_context *dst,
-                                 struct i915_gem_context *src) = {
-#define MAP(x, y) [ilog2(I915_CONTEXT_CLONE_##x)] = y
-               MAP(ENGINES, clone_engines),
-               MAP(FLAGS, clone_flags),
-               MAP(SCHEDATTR, clone_schedattr),
-               MAP(SSEU, clone_sseu),
-               MAP(TIMELINE, clone_timeline),
-               MAP(VM, clone_vm),
-#undef MAP
-       };
-       struct drm_i915_gem_context_create_ext_clone local;
-       const struct create_ext *arg = data;
-       struct i915_gem_context *dst = arg->ctx;
-       struct i915_gem_context *src;
-       int err, bit;
-
-       if (copy_from_user(&local, ext, sizeof(local)))
-               return -EFAULT;
-
-       BUILD_BUG_ON(GENMASK(BITS_PER_TYPE(local.flags) - 1, ARRAY_SIZE(fn)) !=
-                    I915_CONTEXT_CLONE_UNKNOWN);
-
-       if (local.flags & I915_CONTEXT_CLONE_UNKNOWN)
-               return -EINVAL;
-
-       if (local.rsvd)
-               return -EINVAL;
-
-       rcu_read_lock();
-       src = __i915_gem_context_lookup_rcu(arg->fpriv, local.clone_id);
-       rcu_read_unlock();
-       if (!src)
-               return -ENOENT;
-
-       GEM_BUG_ON(src == dst);
-
-       for (bit = 0; bit < ARRAY_SIZE(fn); bit++) {
-               if (!(local.flags & BIT(bit)))
-                       continue;
-
-               err = fn[bit](dst, src);
-               if (err)
-                       return err;
-       }
-
-       return 0;
+       return -EINVAL;
 }
 
 static const i915_user_extension_fn create_extensions[] = {
        [I915_CONTEXT_CREATE_EXT_SETPARAM] = create_setparam,
-       [I915_CONTEXT_CREATE_EXT_CLONE] = create_clone,
+       [I915_CONTEXT_CREATE_EXT_CLONE] = invalid_ext,
 };
 
 static bool client_is_banned(struct drm_i915_file_private *file_priv)
@@ -2438,11 +2115,6 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
                return -ENOENT;
 
        switch (args->param) {
-       case I915_CONTEXT_PARAM_NO_ZEROMAP:
-               args->size = 0;
-               args->value = test_bit(UCONTEXT_NO_ZEROMAP, &ctx->user_flags);
-               break;
-
        case I915_CONTEXT_PARAM_GTT_SIZE:
                args->size = 0;
                rcu_read_lock();
@@ -2490,11 +2162,9 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
                args->value = i915_gem_context_is_persistent(ctx);
                break;
 
-       case I915_CONTEXT_PARAM_RINGSIZE:
-               ret = get_ringsize(ctx, args);
-               break;
-
+       case I915_CONTEXT_PARAM_NO_ZEROMAP:
        case I915_CONTEXT_PARAM_BAN_PERIOD:
+       case I915_CONTEXT_PARAM_RINGSIZE:
        default:
                ret = -EINVAL;
                break;