<div dir="ltr">Reviewed-by: Rodrigo Vivi <<a href="mailto:rodrigo.vivi@intel.com">rodrigo.vivi@intel.com</a>></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jun 27, 2014 at 3:09 PM, Ben Widawsky <span dir="ltr"><<a href="mailto:benjamin.widawsky@intel.com" target="_blank">benjamin.widawsky@intel.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">There are some cases in the code where we need to know how many rings to<br>
iterate over, but cannot use for_each_ring(). These are always error cases<br>
which happen either before ring setup, or after ring teardown (or<br>
reset).<br>
<br>
Note, a NUM_RINGS issue exists in semaphores, but this is fixed by the<br>
remaining semaphore patches which Rodrigo will resubmit shortly. I'd<br>
rather see those patches for fixing the problem than fix it here.<br>
<br>
I found this initially for the BSD2 case where on the same platform we<br>
can have differing rings. AFAICT however this effects many platforms.<br>
<br>
I'd CC stable on this, except I think all the issues have been around<br>
for multiple releases without bug reports.<br>
<br>
Compile tested only for now.<br>
<br>
Signed-off-by: Ben Widawsky <<a href="mailto:ben@bwidawsk.net">ben@bwidawsk.net</a>><br>
---<br>
 drivers/gpu/drm/i915/i915_gem_context.c | 6 +++---<br>
 drivers/gpu/drm/i915/i915_gpu_error.c   | 2 +-<br>
 drivers/gpu/drm/i915/intel_ringbuffer.h | 2 ++<br>
 3 files changed, 6 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c<br>
index b9bac25..0c044a9 100644<br>
--- a/drivers/gpu/drm/i915/i915_gem_context.c<br>
+++ b/drivers/gpu/drm/i915/i915_gem_context.c<br>
@@ -403,7 +403,7 @@ void i915_gem_context_reset(struct drm_device *dev)<br>
<br>
        /* Prevent the hardware from restoring the last context (which hung) on<br>
         * the next switch */<br>
-       for (i = 0; i < I915_NUM_RINGS; i++) {<br>
+       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++) {<br>
                struct intel_engine_cs *ring = &dev_priv->ring[i];<br>
                struct intel_context *dctx = ring->default_context;<br>
<br>
@@ -456,7 +456,7 @@ int i915_gem_context_init(struct drm_device *dev)<br>
        }<br>
<br>
        /* NB: RCS will hold a ref for all rings */<br>
-       for (i = 0; i < I915_NUM_RINGS; i++)<br>
+       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++)<br>
                dev_priv->ring[i].default_context = ctx;<br>
<br>
        DRM_DEBUG_DRIVER("%s context support initialized\n", dev_priv->hw_context_size ? "HW" : "fake");<br>
@@ -493,7 +493,7 @@ void i915_gem_context_fini(struct drm_device *dev)<br>
                i915_gem_object_ggtt_unpin(dctx->obj);<br>
        }<br>
<br>
-       for (i = 0; i < I915_NUM_RINGS; i++) {<br>
+       for (i = 0; i < I915_ACTIVE_RINGS(dev); i++) {<br>
                struct intel_engine_cs *ring = &dev_priv->ring[i];<br>
<br>
                if (ring->last_context)<br>
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c<br>
index 86362de..6e5250d 100644<br>
--- a/drivers/gpu/drm/i915/i915_gpu_error.c<br>
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c<br>
@@ -848,7 +848,7 @@ static uint32_t i915_error_generate_code(struct drm_i915_private *dev_priv,<br>
         * synchronization commands which almost always appear in the case<br>
         * strictly a client bug. Use instdone to differentiate those some.<br>
         */<br>
-       for (i = 0; i < I915_NUM_RINGS; i++) {<br>
+       for (i = 0; i < I915_ACTIVE_RINGS(dev_priv->dev); i++) {<br>
                if (error->ring[i].hangcheck_action == HANGCHECK_HUNG) {<br>
                        if (ring_id)<br>
                                *ring_id = i;<br>
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h<br>
index e72017b..67e2919 100644<br>
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h<br>
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h<br>
@@ -90,6 +90,8 @@ struct  intel_engine_cs {<br>
        } id;<br>
 #define I915_NUM_RINGS 5<br>
 #define LAST_USER_RING (VECS + 1)<br>
+#define I915_ACTIVE_RINGS(dev) hweight8(INTEL_INFO(dev)->ring_mask)<br>
+<br>
        u32             mmio_base;<br>
        struct          drm_device *dev;<br>
        struct intel_ringbuffer *buffer;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.0.0<br>
<br>
_______________________________________________<br>
Intel-gfx mailing list<br>
<a href="mailto:Intel-gfx@lists.freedesktop.org">Intel-gfx@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/intel-gfx" target="_blank">http://lists.freedesktop.org/mailman/listinfo/intel-gfx</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Rodrigo Vivi</div><div>Blog: <a href="http://blog.vivi.eng.br" target="_blank">http://blog.vivi.eng.br</a></div><div> </div>
</div>