|
@@ -1412,10 +1412,7 @@ execbuf_submit(struct i915_execbuffer_params *params,
|
|
struct drm_i915_gem_execbuffer2 *args,
|
|
struct drm_i915_gem_execbuffer2 *args,
|
|
struct list_head *vmas)
|
|
struct list_head *vmas)
|
|
{
|
|
{
|
|
- struct drm_i915_private *dev_priv = params->request->i915;
|
|
|
|
u64 exec_start, exec_len;
|
|
u64 exec_start, exec_len;
|
|
- int instp_mode;
|
|
|
|
- u32 instp_mask, *cs;
|
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas);
|
|
ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas);
|
|
@@ -1426,54 +1423,11 @@ execbuf_submit(struct i915_execbuffer_params *params,
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
- instp_mode = args->flags & I915_EXEC_CONSTANTS_MASK;
|
|
|
|
- instp_mask = I915_EXEC_CONSTANTS_MASK;
|
|
|
|
- switch (instp_mode) {
|
|
|
|
- case I915_EXEC_CONSTANTS_REL_GENERAL:
|
|
|
|
- case I915_EXEC_CONSTANTS_ABSOLUTE:
|
|
|
|
- case I915_EXEC_CONSTANTS_REL_SURFACE:
|
|
|
|
- if (instp_mode != 0 && params->engine->id != RCS) {
|
|
|
|
- DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (instp_mode != dev_priv->relative_constants_mode) {
|
|
|
|
- if (INTEL_INFO(dev_priv)->gen < 4) {
|
|
|
|
- DRM_DEBUG("no rel constants on pre-gen4\n");
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (INTEL_INFO(dev_priv)->gen > 5 &&
|
|
|
|
- instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
|
|
|
|
- DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* The HW changed the meaning on this bit on gen6 */
|
|
|
|
- if (INTEL_INFO(dev_priv)->gen >= 6)
|
|
|
|
- instp_mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- DRM_DEBUG("execbuf with unknown constants: %d\n", instp_mode);
|
|
|
|
|
|
+ if (args->flags & I915_EXEC_CONSTANTS_MASK) {
|
|
|
|
+ DRM_DEBUG("I915_EXEC_CONSTANTS_* unsupported\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
- if (params->engine->id == RCS &&
|
|
|
|
- instp_mode != dev_priv->relative_constants_mode) {
|
|
|
|
- cs = intel_ring_begin(params->request, 4);
|
|
|
|
- if (IS_ERR(cs))
|
|
|
|
- return PTR_ERR(cs);
|
|
|
|
-
|
|
|
|
- *cs++ = MI_NOOP;
|
|
|
|
- *cs++ = MI_LOAD_REGISTER_IMM(1);
|
|
|
|
- *cs++ = i915_mmio_reg_offset(INSTPM);
|
|
|
|
- *cs++ = instp_mask << 16 | instp_mode;
|
|
|
|
- intel_ring_advance(params->request, cs);
|
|
|
|
-
|
|
|
|
- dev_priv->relative_constants_mode = instp_mode;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
|
|
if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
|
|
ret = i915_reset_gen7_sol_offsets(params->request);
|
|
ret = i915_reset_gen7_sol_offsets(params->request);
|
|
if (ret)
|
|
if (ret)
|