diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 52 |
1 files changed, 2 insertions, 50 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 0c400f852a76..2117f172d7a2 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -1454,10 +1454,7 @@ execbuf_submit(struct i915_execbuffer_params *params, | |||
1454 | struct drm_i915_gem_execbuffer2 *args, | 1454 | struct drm_i915_gem_execbuffer2 *args, |
1455 | struct list_head *vmas) | 1455 | struct list_head *vmas) |
1456 | { | 1456 | { |
1457 | struct drm_i915_private *dev_priv = params->request->i915; | ||
1458 | u64 exec_start, exec_len; | 1457 | u64 exec_start, exec_len; |
1459 | int instp_mode; | ||
1460 | u32 instp_mask; | ||
1461 | int ret; | 1458 | int ret; |
1462 | 1459 | ||
1463 | ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas); | 1460 | ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas); |
@@ -1468,56 +1465,11 @@ execbuf_submit(struct i915_execbuffer_params *params, | |||
1468 | if (ret) | 1465 | if (ret) |
1469 | return ret; | 1466 | return ret; |
1470 | 1467 | ||
1471 | instp_mode = args->flags & I915_EXEC_CONSTANTS_MASK; | 1468 | if (args->flags & I915_EXEC_CONSTANTS_MASK) { |
1472 | instp_mask = I915_EXEC_CONSTANTS_MASK; | 1469 | DRM_DEBUG("I915_EXEC_CONSTANTS_* unsupported\n"); |
1473 | switch (instp_mode) { | ||
1474 | case I915_EXEC_CONSTANTS_REL_GENERAL: | ||
1475 | case I915_EXEC_CONSTANTS_ABSOLUTE: | ||
1476 | case I915_EXEC_CONSTANTS_REL_SURFACE: | ||
1477 | if (instp_mode != 0 && params->engine->id != RCS) { | ||
1478 | DRM_DEBUG("non-0 rel constants mode on non-RCS\n"); | ||
1479 | return -EINVAL; | ||
1480 | } | ||
1481 | |||
1482 | if (instp_mode != dev_priv->relative_constants_mode) { | ||
1483 | if (INTEL_INFO(dev_priv)->gen < 4) { | ||
1484 | DRM_DEBUG("no rel constants on pre-gen4\n"); | ||
1485 | return -EINVAL; | ||
1486 | } | ||
1487 | |||
1488 | if (INTEL_INFO(dev_priv)->gen > 5 && | ||
1489 | instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE) { | ||
1490 | DRM_DEBUG("rel surface constants mode invalid on gen5+\n"); | ||
1491 | return -EINVAL; | ||
1492 | } | ||
1493 | |||
1494 | /* The HW changed the meaning on this bit on gen6 */ | ||
1495 | if (INTEL_INFO(dev_priv)->gen >= 6) | ||
1496 | instp_mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE; | ||
1497 | } | ||
1498 | break; | ||
1499 | default: | ||
1500 | DRM_DEBUG("execbuf with unknown constants: %d\n", instp_mode); | ||
1501 | return -EINVAL; | 1470 | return -EINVAL; |
1502 | } | 1471 | } |
1503 | 1472 | ||
1504 | if (params->engine->id == RCS && | ||
1505 | instp_mode != dev_priv->relative_constants_mode) { | ||
1506 | struct intel_ring *ring = params->request->ring; | ||
1507 | |||
1508 | ret = intel_ring_begin(params->request, 4); | ||
1509 | if (ret) | ||
1510 | return ret; | ||
1511 | |||
1512 | intel_ring_emit(ring, MI_NOOP); | ||
1513 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); | ||
1514 | intel_ring_emit_reg(ring, INSTPM); | ||
1515 | intel_ring_emit(ring, instp_mask << 16 | instp_mode); | ||
1516 | intel_ring_advance(ring); | ||
1517 | |||
1518 | dev_priv->relative_constants_mode = instp_mode; | ||
1519 | } | ||
1520 | |||
1521 | if (args->flags & I915_EXEC_GEN7_SOL_RESET) { | 1473 | if (args->flags & I915_EXEC_GEN7_SOL_RESET) { |
1522 | ret = i915_reset_gen7_sol_offsets(params->request); | 1474 | ret = i915_reset_gen7_sol_offsets(params->request); |
1523 | if (ret) | 1475 | if (ret) |