|
@@ -762,3 +762,72 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
|
|
|
DRM_DEBUG_DRIVER("HW context %d destroyed\n", args->ctx_id);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
|
|
|
+ struct drm_file *file)
|
|
|
+{
|
|
|
+ struct drm_i915_file_private *file_priv = file->driver_priv;
|
|
|
+ struct drm_i915_gem_context_param *args = data;
|
|
|
+ struct intel_context *ctx;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = i915_mutex_lock_interruptible(dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ctx = i915_gem_context_get(file_priv, args->ctx_id);
|
|
|
+ if (IS_ERR(ctx)) {
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+ return PTR_ERR(ctx);
|
|
|
+ }
|
|
|
+
|
|
|
+ args->size = 0;
|
|
|
+ switch (args->param) {
|
|
|
+ case I915_CONTEXT_PARAM_BAN_PERIOD:
|
|
|
+ args->value = ctx->hang_stats.ban_period_seconds;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ret = -EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
|
|
|
+ struct drm_file *file)
|
|
|
+{
|
|
|
+ struct drm_i915_file_private *file_priv = file->driver_priv;
|
|
|
+ struct drm_i915_gem_context_param *args = data;
|
|
|
+ struct intel_context *ctx;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = i915_mutex_lock_interruptible(dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ctx = i915_gem_context_get(file_priv, args->ctx_id);
|
|
|
+ if (IS_ERR(ctx)) {
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+ return PTR_ERR(ctx);
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (args->param) {
|
|
|
+ case I915_CONTEXT_PARAM_BAN_PERIOD:
|
|
|
+ if (args->size)
|
|
|
+ ret = -EINVAL;
|
|
|
+ else if (args->value < ctx->hang_stats.ban_period_seconds &&
|
|
|
+ !capable(CAP_SYS_ADMIN))
|
|
|
+ ret = -EPERM;
|
|
|
+ else
|
|
|
+ ctx->hang_stats.ban_period_seconds = args->value;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ret = -EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|