In the discussions around commit 373701b1 (Jani Nikula)
    drm: fix potential dangling else problems in for_each_ macros
Daniel Vetter mooted the idea of a for_each_engine(ring, dev_priv)
macro that didn't use or rely on having an integer index variable.

So here it is; and, for backwards compatibility, an updated version
of for_each_ring() implemented using the same internals. As an example
of the use of this new macro, the functions in intel_uncore.c have
been converted to use it in preference to for_each_ring() wherever
possible. A subsequent patch will convert many of the uses in other
source files.

Cc: Daniel Vetter <[email protected]>
Cc: Jani Nikula <[email protected]>
Cc: Chris Wilson <[email protected]>
Signed-off-by: Dave Gordon <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h     | 32 ++++++++++++++++++++++++++++----
 drivers/gpu/drm/i915/intel_uncore.c |  5 ++---
 2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index cf7e0fc..a6457ee 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1968,10 +1968,34 @@ static inline struct drm_i915_private 
*guc_to_i915(struct intel_guc *guc)
        return container_of(guc, struct drm_i915_private, guc);
 }
 
-/* Iterate over initialised rings */
-#define for_each_ring(ring__, dev_priv__, i__) \
-       for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
-               for_each_if ((((ring__) = &(dev_priv__)->ring[(i__)]), 
intel_ring_initialized((ring__))))
+/* Helpers for the for_each_* macros below */
+#define        __INIT_ENGINE_PTR(engine, dev_priv)                             
\
+       ({                                                              \
+               struct intel_engine_cs *ep = (dev_priv)->ring;          \
+               (engine) = --ep;                                        \
+       })
+#define        __NEXT_ACTIVE_ENGINE(engine, dev_priv, nr)                      
\
+       ({                                                              \
+               struct intel_engine_cs *end = &(dev_priv)->ring[nr];    \
+               struct intel_engine_cs *ep = (engine);                  \
+               bool in_range;                                          \
+               do {                                                    \
+                       in_range = ++(ep) < end;                        \
+               } while (in_range && !intel_ring_initialized(ep));      \
+               (engine) = ep;                                          \
+               in_range;                                               \
+       })
+
+/* Iterate over initialised engines */
+#define for_each_engine(engine, dev_priv)                              \
+       for (__INIT_ENGINE_PTR(engine, dev_priv);                       \
+            __NEXT_ACTIVE_ENGINE(engine, dev_priv, I915_NUM_RINGS); )
+
+/* Backwards compatibility: iterate over initialised "rings" */
+#define for_each_ring(engine, dev_priv, ring_id)                       \
+       for (__INIT_ENGINE_PTR(engine, dev_priv);                       \
+            __NEXT_ACTIVE_ENGINE(engine, dev_priv, I915_NUM_RINGS) &&  \
+            ((ring_id) = (engine)->id, true); )
 
 enum hdmi_force_audio {
        HDMI_AUDIO_OFF_DVI = -2,        /* no aux data for HDMI-DVI converter */
diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
b/drivers/gpu/drm/i915/intel_uncore.c
index 277e60a..240c244 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1508,9 +1508,8 @@ static int gen8_do_reset(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *engine;
-       int i;
 
-       for_each_ring(engine, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                I915_WRITE(RING_RESET_CTL(engine->mmio_base),
                           _MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET));
 
@@ -1527,7 +1526,7 @@ static int gen8_do_reset(struct drm_device *dev)
        return gen6_do_reset(dev);
 
 not_ready:
-       for_each_ring(engine, dev_priv, i)
+       for_each_engine(engine, dev_priv)
                I915_WRITE(RING_RESET_CTL(engine->mmio_base),
                           _MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
 
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to