drm/i915: Drop the CONTEXT_CLONE API (v2)
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gem / i915_gem_context.c
index 3503d46..9f9369d 100644 (file)
@@ -1957,207 +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 clone_engines(struct i915_gem_context *dst,
-                        struct i915_gem_context *src)
+static int invalid_ext(struct i915_user_extension __user *ext, void *data)
 {
-       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);
-       }
-       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)