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.c56
1 files changed, 5 insertions, 51 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index d02cfaefe1c8..15a15d00a6bf 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -888,6 +888,7 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *engine,
888 struct list_head ordered_vmas; 888 struct list_head ordered_vmas;
889 struct list_head pinned_vmas; 889 struct list_head pinned_vmas;
890 bool has_fenced_gpu_access = INTEL_GEN(engine->i915) < 4; 890 bool has_fenced_gpu_access = INTEL_GEN(engine->i915) < 4;
891 bool needs_unfenced_map = INTEL_INFO(engine->i915)->unfenced_needs_alignment;
891 int retry; 892 int retry;
892 893
893 vm = list_first_entry(vmas, struct i915_vma, exec_list)->vm; 894 vm = list_first_entry(vmas, struct i915_vma, exec_list)->vm;
@@ -908,7 +909,8 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *engine,
908 if (!has_fenced_gpu_access) 909 if (!has_fenced_gpu_access)
909 entry->flags &= ~EXEC_OBJECT_NEEDS_FENCE; 910 entry->flags &= ~EXEC_OBJECT_NEEDS_FENCE;
910 need_fence = 911 need_fence =
911 entry->flags & EXEC_OBJECT_NEEDS_FENCE && 912 (entry->flags & EXEC_OBJECT_NEEDS_FENCE ||
913 needs_unfenced_map) &&
912 i915_gem_object_is_tiled(obj); 914 i915_gem_object_is_tiled(obj);
913 need_mappable = need_fence || need_reloc_mappable(vma); 915 need_mappable = need_fence || need_reloc_mappable(vma);
914 916
@@ -1408,10 +1410,7 @@ execbuf_submit(struct i915_execbuffer_params *params,
1408 struct drm_i915_gem_execbuffer2 *args, 1410 struct drm_i915_gem_execbuffer2 *args,
1409 struct list_head *vmas) 1411 struct list_head *vmas)
1410{ 1412{
1411 struct drm_i915_private *dev_priv = params->request->i915;
1412 u64 exec_start, exec_len; 1413 u64 exec_start, exec_len;
1413 int instp_mode;
1414 u32 instp_mask;
1415 int ret; 1414 int ret;
1416 1415
1417 ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas); 1416 ret = i915_gem_execbuffer_move_to_gpu(params->request, vmas);
@@ -1422,56 +1421,11 @@ execbuf_submit(struct i915_execbuffer_params *params,
1422 if (ret) 1421 if (ret)
1423 return ret; 1422 return ret;
1424 1423
1425 instp_mode = args->flags & I915_EXEC_CONSTANTS_MASK; 1424 if (args->flags & I915_EXEC_CONSTANTS_MASK) {
1426 instp_mask = I915_EXEC_CONSTANTS_MASK; 1425 DRM_DEBUG("I915_EXEC_CONSTANTS_* unsupported\n");
1427 switch (instp_mode) {
1428 case I915_EXEC_CONSTANTS_REL_GENERAL:
1429 case I915_EXEC_CONSTANTS_ABSOLUTE:
1430 case I915_EXEC_CONSTANTS_REL_SURFACE:
1431 if (instp_mode != 0 && params->engine->id != RCS) {
1432 DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
1433 return -EINVAL;
1434 }
1435
1436 if (instp_mode != dev_priv->relative_constants_mode) {
1437 if (INTEL_INFO(dev_priv)->gen < 4) {
1438 DRM_DEBUG("no rel constants on pre-gen4\n");
1439 return -EINVAL;
1440 }
1441
1442 if (INTEL_INFO(dev_priv)->gen > 5 &&
1443 instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
1444 DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
1445 return -EINVAL;
1446 }
1447
1448 /* The HW changed the meaning on this bit on gen6 */
1449 if (INTEL_INFO(dev_priv)->gen >= 6)
1450 instp_mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE;
1451 }
1452 break;
1453 default:
1454 DRM_DEBUG("execbuf with unknown constants: %d\n", instp_mode);
1455 return -EINVAL; 1426 return -EINVAL;
1456 } 1427 }
1457 1428
1458 if (params->engine->id == RCS &&
1459 instp_mode != dev_priv->relative_constants_mode) {
1460 struct intel_ring *ring = params->request->ring;
1461
1462 ret = intel_ring_begin(params->request, 4);
1463 if (ret)
1464 return ret;
1465
1466 intel_ring_emit(ring, MI_NOOP);
1467 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
1468 intel_ring_emit_reg(ring, INSTPM);
1469 intel_ring_emit(ring, instp_mask << 16 | instp_mode);
1470 intel_ring_advance(ring);
1471
1472 dev_priv->relative_constants_mode = instp_mode;
1473 }
1474
1475 if (args->flags & I915_EXEC_GEN7_SOL_RESET) { 1429 if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
1476 ret = i915_reset_gen7_sol_offsets(params->request); 1430 ret = i915_reset_gen7_sol_offsets(params->request);
1477 if (ret) 1431 if (ret)