aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_execbuffer.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-10-17 07:09:54 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-17 15:06:59 -0400
commitd7d4eeddb8f72342f70621c4b3cb718af9361712 (patch)
treee8a11c37fa8dbaf9e93859e91812ff131ca0e20b /drivers/gpu/drm/i915/i915_gem_execbuffer.c
parent76e438303403f301f3509479b544e41518edd059 (diff)
drm/i915: Allow DRM_ROOT_ONLY|DRM_MASTER to submit privileged batchbuffers
With the introduction of per-process GTT space, the hardware designers thought it wise to also limit the ability to write to MMIO space to only a "secure" batch buffer. The ability to rewrite registers is the only way to program the hardware to perform certain operations like scanline waits (required for tear-free windowed updates). So we either have a choice of adding an interface to perform those synchronized updates inside the kernel, or we permit certain processes the ability to write to the "safe" registers from within its command stream. This patch exposes the ability to submit a SECURE batch buffer to DRM_ROOT_ONLY|DRM_MASTER processes. v2: Haswell split up bit8 into a ppgtt bit (still bit8) and a security bit (bit 13, accidentally not set). Also add a comment explaining why secure batches need a global gtt binding. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v1) [danvet: added hsw fixup.] Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 6a2f3e50c714..afbc9240a992 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -801,6 +801,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
801 u32 exec_start, exec_len; 801 u32 exec_start, exec_len;
802 u32 seqno; 802 u32 seqno;
803 u32 mask; 803 u32 mask;
804 u32 flags;
804 int ret, mode, i; 805 int ret, mode, i;
805 806
806 if (!i915_gem_check_execbuffer(args)) { 807 if (!i915_gem_check_execbuffer(args)) {
@@ -812,6 +813,14 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
812 if (ret) 813 if (ret)
813 return ret; 814 return ret;
814 815
816 flags = 0;
817 if (args->flags & I915_EXEC_SECURE) {
818 if (!file->is_master || !capable(CAP_SYS_ADMIN))
819 return -EPERM;
820
821 flags |= I915_DISPATCH_SECURE;
822 }
823
815 switch (args->flags & I915_EXEC_RING_MASK) { 824 switch (args->flags & I915_EXEC_RING_MASK) {
816 case I915_EXEC_DEFAULT: 825 case I915_EXEC_DEFAULT:
817 case I915_EXEC_RENDER: 826 case I915_EXEC_RENDER:
@@ -984,6 +993,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
984 } 993 }
985 batch_obj->base.pending_read_domains |= I915_GEM_DOMAIN_COMMAND; 994 batch_obj->base.pending_read_domains |= I915_GEM_DOMAIN_COMMAND;
986 995
996 /* snb/ivb/vlv conflate the "batch in ppgtt" bit with the "non-secure
997 * batch" bit. Hence we need to pin secure batches into the global gtt.
998 * hsw should have this fixed, but let's be paranoid and do it
999 * unconditionally for now. */
1000 if (flags & I915_DISPATCH_SECURE && !batch_obj->has_global_gtt_mapping)
1001 i915_gem_gtt_bind_object(batch_obj, batch_obj->cache_level);
1002
987 ret = i915_gem_execbuffer_move_to_gpu(ring, &objects); 1003 ret = i915_gem_execbuffer_move_to_gpu(ring, &objects);
988 if (ret) 1004 if (ret)
989 goto err; 1005 goto err;
@@ -1029,7 +1045,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
1029 goto err; 1045 goto err;
1030 } 1046 }
1031 1047
1032 trace_i915_gem_ring_dispatch(ring, seqno); 1048 trace_i915_gem_ring_dispatch(ring, seqno, flags);
1033 1049
1034 exec_start = batch_obj->gtt_offset + args->batch_start_offset; 1050 exec_start = batch_obj->gtt_offset + args->batch_start_offset;
1035 exec_len = args->batch_len; 1051 exec_len = args->batch_len;
@@ -1041,12 +1057,15 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
1041 goto err; 1057 goto err;
1042 1058
1043 ret = ring->dispatch_execbuffer(ring, 1059 ret = ring->dispatch_execbuffer(ring,
1044 exec_start, exec_len); 1060 exec_start, exec_len,
1061 flags);
1045 if (ret) 1062 if (ret)
1046 goto err; 1063 goto err;
1047 } 1064 }
1048 } else { 1065 } else {
1049 ret = ring->dispatch_execbuffer(ring, exec_start, exec_len); 1066 ret = ring->dispatch_execbuffer(ring,
1067 exec_start, exec_len,
1068 flags);
1050 if (ret) 1069 if (ret)
1051 goto err; 1070 goto err;
1052 } 1071 }