aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_context.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-06-04 17:42:54 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-06-14 11:36:20 -0400
commit846248136dd3a6723135b8515ed7dc4c52a7b2ae (patch)
treefb8b3fdc86ba3632ca8edeb71074fde6b41753ff /drivers/gpu/drm/i915/i915_gem_context.c
parentf2ef6eb1453a95ce8ab388493793c54a6bedc405 (diff)
drm/i915/context: create & destroy ioctls
Add the interfaces to allow user space to create and destroy contexts. Contexts are destroyed automatically if the file descriptor for the dri device is closed. Following convention as usual here causes checkpatch warnings. v2: with is_initialized, no longer need to init at create drop the context switch on create (daniel) v3: Use interruptible lock (Chris) return -ENODEV in !GEM case (Chris) Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_context.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 6a7b67d9f43f..5642c4019b53 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -489,3 +489,58 @@ int i915_switch_context(struct intel_ring_buffer *ring,
489 drm_gem_object_unreference(&from_obj->base); 489 drm_gem_object_unreference(&from_obj->base);
490 return ret; 490 return ret;
491} 491}
492
493int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
494 struct drm_file *file)
495{
496 struct drm_i915_private *dev_priv = dev->dev_private;
497 struct drm_i915_gem_context_create *args = data;
498 struct drm_i915_file_private *file_priv = file->driver_priv;
499 struct i915_hw_context *ctx;
500 int ret;
501
502 if (!(dev->driver->driver_features & DRIVER_GEM))
503 return -ENODEV;
504
505 ret = i915_mutex_lock_interruptible(dev);
506 if (ret)
507 return ret;
508
509 ret = create_hw_context(dev, file_priv, &ctx);
510 mutex_unlock(&dev->struct_mutex);
511
512 args->ctx_id = ctx->id;
513 DRM_DEBUG_DRIVER("HW context %d created\n", args->ctx_id);
514
515 return ret;
516}
517
518int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
519 struct drm_file *file)
520{
521 struct drm_i915_gem_context_destroy *args = data;
522 struct drm_i915_file_private *file_priv = file->driver_priv;
523 struct drm_i915_private *dev_priv = dev->dev_private;
524 struct i915_hw_context *ctx;
525 int ret;
526
527 if (!(dev->driver->driver_features & DRIVER_GEM))
528 return -ENODEV;
529
530 ret = i915_mutex_lock_interruptible(dev);
531 if (ret)
532 return ret;
533
534 ctx = i915_gem_context_get(file_priv, args->ctx_id);
535 if (!ctx) {
536 mutex_unlock(&dev->struct_mutex);
537 return -EINVAL;
538 }
539
540 do_destroy(ctx);
541
542 mutex_unlock(&dev->struct_mutex);
543
544 DRM_DEBUG_DRIVER("HW context %d destroyed\n", args->ctx_id);
545 return 0;
546}