Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0f5b82c authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/i915: Catch abuse of I915_EXEC_CONSTANTS_*



A bit tricky since 0 is also a valid constant ...

v2: Add DRM_DEBUG (Chris)

Testcase: igt/gem_exec_params/rel-constants-*
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 9d662da8
Loading
Loading
Loading
Loading
+12 −4
Original line number Original line Diff line number Diff line
@@ -1060,14 +1060,22 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
	case I915_EXEC_CONSTANTS_REL_GENERAL:
	case I915_EXEC_CONSTANTS_REL_GENERAL:
	case I915_EXEC_CONSTANTS_ABSOLUTE:
	case I915_EXEC_CONSTANTS_ABSOLUTE:
	case I915_EXEC_CONSTANTS_REL_SURFACE:
	case I915_EXEC_CONSTANTS_REL_SURFACE:
		if (ring == &dev_priv->ring[RCS] &&
		if (mode != 0 && ring != &dev_priv->ring[RCS]) {
		    mode != dev_priv->relative_constants_mode) {
			DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
			if (INTEL_INFO(dev)->gen < 4)
			return -EINVAL;
		}

		if (mode != dev_priv->relative_constants_mode) {
			if (INTEL_INFO(dev)->gen < 4) {
				DRM_DEBUG("no rel constants on pre-gen4\n");
				return -EINVAL;
				return -EINVAL;
			}


			if (INTEL_INFO(dev)->gen > 5 &&
			if (INTEL_INFO(dev)->gen > 5 &&
			    mode == I915_EXEC_CONSTANTS_REL_SURFACE)
			    mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
				DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
				return -EINVAL;
				return -EINVAL;
			}


			/* The HW changed the meaning on this bit on gen6 */
			/* The HW changed the meaning on this bit on gen6 */
			if (INTEL_INFO(dev)->gen >= 6)
			if (INTEL_INFO(dev)->gen >= 6)