diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 56 |
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) |