|
@@ -1348,6 +1348,8 @@ static int i9xx_emit_breadcrumb(struct drm_i915_gem_request *req)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const int i9xx_emit_breadcrumb_sz = 4;
|
|
|
+
|
|
|
/**
|
|
|
* gen6_sema_emit_breadcrumb - Update the semaphore mailbox registers
|
|
|
*
|
|
@@ -1401,6 +1403,8 @@ static int gen8_render_emit_breadcrumb(struct drm_i915_gem_request *req)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const int gen8_render_emit_breadcrumb_sz = 8;
|
|
|
+
|
|
|
/**
|
|
|
* intel_ring_sync - sync the waiter to the signaller on seqno
|
|
|
*
|
|
@@ -2638,8 +2642,21 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
|
|
|
engine->reset_hw = reset_ring_common;
|
|
|
|
|
|
engine->emit_breadcrumb = i9xx_emit_breadcrumb;
|
|
|
- if (i915.semaphores)
|
|
|
+ engine->emit_breadcrumb_sz = i9xx_emit_breadcrumb_sz;
|
|
|
+ if (i915.semaphores) {
|
|
|
+ int num_rings;
|
|
|
+
|
|
|
engine->emit_breadcrumb = gen6_sema_emit_breadcrumb;
|
|
|
+
|
|
|
+ num_rings = hweight32(INTEL_INFO(dev_priv)->ring_mask) - 1;
|
|
|
+ if (INTEL_GEN(dev_priv) >= 8) {
|
|
|
+ engine->emit_breadcrumb_sz += num_rings * 6;
|
|
|
+ } else {
|
|
|
+ engine->emit_breadcrumb_sz += num_rings * 3;
|
|
|
+ if (num_rings & 1)
|
|
|
+ engine->emit_breadcrumb_sz++;
|
|
|
+ }
|
|
|
+ }
|
|
|
engine->submit_request = i9xx_submit_request;
|
|
|
|
|
|
if (INTEL_GEN(dev_priv) >= 8)
|
|
@@ -2667,9 +2684,17 @@ int intel_init_render_ring_buffer(struct intel_engine_cs *engine)
|
|
|
if (INTEL_GEN(dev_priv) >= 8) {
|
|
|
engine->init_context = intel_rcs_ctx_init;
|
|
|
engine->emit_breadcrumb = gen8_render_emit_breadcrumb;
|
|
|
+ engine->emit_breadcrumb_sz = gen8_render_emit_breadcrumb_sz;
|
|
|
engine->emit_flush = gen8_render_ring_flush;
|
|
|
- if (i915.semaphores)
|
|
|
+ if (i915.semaphores) {
|
|
|
+ int num_rings;
|
|
|
+
|
|
|
engine->semaphore.signal = gen8_rcs_signal;
|
|
|
+
|
|
|
+ num_rings =
|
|
|
+ hweight32(INTEL_INFO(dev_priv)->ring_mask) - 1;
|
|
|
+ engine->emit_breadcrumb_sz += num_rings * 6;
|
|
|
+ }
|
|
|
} else if (INTEL_GEN(dev_priv) >= 6) {
|
|
|
engine->init_context = intel_rcs_ctx_init;
|
|
|
engine->emit_flush = gen7_render_ring_flush;
|