aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-12-24 11:13:40 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-01-07 12:19:06 -0500
commitc9dc0f35986c0e2fc81e0b71ddc7e3adad733829 (patch)
treed59a7dc0157916e519d9aa04527f85eea670cec5 /drivers
parentf9b61ff6bce9a44555324b29e593fdffc9a115bc (diff)
drm/i915: Add ioctl to set per-context parameters
Sometimes we wish to tweak how an individual context behaves. Since we always create a context for every filp, this means that individual processes can fine tune their behaviour even if they do not explicitly create a context. The first example parameter here is to enable multi-process GPU testing, but the interface should be able to cope with passing arbitrarily complex parameters. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> Testcase: igt/gem_reset_stats/ban-period-* Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c69
3 files changed, 75 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 7fad6b8ac63a..8cbff3010e1c 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1066,6 +1066,8 @@ const struct drm_ioctl_desc i915_ioctls[] = {
1066 DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), 1066 DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1067 DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), 1067 DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1068 DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), 1068 DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1069 DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_GETPARAM, i915_gem_context_getparam_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1070 DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_SETPARAM, i915_gem_context_setparam_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1069}; 1071};
1070 1072
1071int i915_max_ioctl = ARRAY_SIZE(i915_ioctls); 1073int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ee841349407e..71016f5192c5 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2898,6 +2898,10 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
2898 struct drm_file *file); 2898 struct drm_file *file);
2899int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data, 2899int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
2900 struct drm_file *file); 2900 struct drm_file *file);
2901int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
2902 struct drm_file *file_priv);
2903int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
2904 struct drm_file *file_priv);
2901 2905
2902/* i915_gem_evict.c */ 2906/* i915_gem_evict.c */
2903int __must_check i915_gem_evict_something(struct drm_device *dev, 2907int __must_check i915_gem_evict_something(struct drm_device *dev,
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 1d10c21f979b..b775ed4a189c 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -762,3 +762,72 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
762 DRM_DEBUG_DRIVER("HW context %d destroyed\n", args->ctx_id); 762 DRM_DEBUG_DRIVER("HW context %d destroyed\n", args->ctx_id);
763 return 0; 763 return 0;
764} 764}
765
766int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
767 struct drm_file *file)
768{
769 struct drm_i915_file_private *file_priv = file->driver_priv;
770 struct drm_i915_gem_context_param *args = data;
771 struct intel_context *ctx;
772 int ret;
773
774 ret = i915_mutex_lock_interruptible(dev);
775 if (ret)
776 return ret;
777
778 ctx = i915_gem_context_get(file_priv, args->ctx_id);
779 if (IS_ERR(ctx)) {
780 mutex_unlock(&dev->struct_mutex);
781 return PTR_ERR(ctx);
782 }
783
784 args->size = 0;
785 switch (args->param) {
786 case I915_CONTEXT_PARAM_BAN_PERIOD:
787 args->value = ctx->hang_stats.ban_period_seconds;
788 break;
789 default:
790 ret = -EINVAL;
791 break;
792 }
793 mutex_unlock(&dev->struct_mutex);
794
795 return ret;
796}
797
798int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
799 struct drm_file *file)
800{
801 struct drm_i915_file_private *file_priv = file->driver_priv;
802 struct drm_i915_gem_context_param *args = data;
803 struct intel_context *ctx;
804 int ret;
805
806 ret = i915_mutex_lock_interruptible(dev);
807 if (ret)
808 return ret;
809
810 ctx = i915_gem_context_get(file_priv, args->ctx_id);
811 if (IS_ERR(ctx)) {
812 mutex_unlock(&dev->struct_mutex);
813 return PTR_ERR(ctx);
814 }
815
816 switch (args->param) {
817 case I915_CONTEXT_PARAM_BAN_PERIOD:
818 if (args->size)
819 ret = -EINVAL;
820 else if (args->value < ctx->hang_stats.ban_period_seconds &&
821 !capable(CAP_SYS_ADMIN))
822 ret = -EPERM;
823 else
824 ctx->hang_stats.ban_period_seconds = args->value;
825 break;
826 default:
827 ret = -EINVAL;
828 break;
829 }
830 mutex_unlock(&dev->struct_mutex);
831
832 return ret;
833}