aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_execbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c52
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)