Use find-first-set bitop to quickly scan through the fw_domains mask and
skip iterating over unused domains.

v2: Move the WARN into the caller, to prevent compiler warnings in
normal builds.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_debugfs.c |  3 ++-
 drivers/gpu/drm/i915/i915_drv.h     | 30 +++++++++++------------
 drivers/gpu/drm/i915/intel_uncore.c | 48 ++++++++++++++++++++++++-------------
 3 files changed, 48 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 29bf11d8b620..fcac795d4396 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1461,9 +1461,10 @@ static int i915_forcewake_domains(struct seq_file *m, 
void *data)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        struct intel_uncore_forcewake_domain *fw_domain;
+       unsigned int tmp;
 
        spin_lock_irq(&dev_priv->uncore.lock);
-       for_each_fw_domain(fw_domain, dev_priv) {
+       for_each_fw_domain(fw_domain, dev_priv, tmp) {
                seq_printf(m, "%s.wake_count = %u\n",
                           intel_uncore_forcewake_domain_to_str(fw_domain->id),
                           fw_domain->wake_count);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 4c9de7d00eaf..589f91c4e585 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -703,9 +703,9 @@ enum forcewake_domain_id {
 };
 
 enum forcewake_domains {
-       FORCEWAKE_RENDER = (1 << FW_DOMAIN_ID_RENDER),
-       FORCEWAKE_BLITTER = (1 << FW_DOMAIN_ID_BLITTER),
-       FORCEWAKE_MEDIA = (1 << FW_DOMAIN_ID_MEDIA),
+       FORCEWAKE_RENDER = BIT(FW_DOMAIN_ID_RENDER),
+       FORCEWAKE_BLITTER = BIT(FW_DOMAIN_ID_BLITTER),
+       FORCEWAKE_MEDIA = BIT(FW_DOMAIN_ID_MEDIA),
        FORCEWAKE_ALL = (FORCEWAKE_RENDER |
                         FORCEWAKE_BLITTER |
                         FORCEWAKE_MEDIA)
@@ -790,15 +790,19 @@ struct intel_uncore {
        int unclaimed_mmio_check;
 };
 
+#define __mask_next_bit(mask) ({                                       \
+       int __idx = ffs(mask) - 1;                                      \
+       mask &= ~BIT(__idx);                                            \
+       __idx;                                                          \
+})
+
 /* Iterate over initialised fw domains */
-#define for_each_fw_domain_masked(domain__, mask__, dev_priv__) \
-       for ((domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
-            (domain__) < &(dev_priv__)->uncore.fw_domain[FW_DOMAIN_ID_COUNT]; \
-            (domain__)++) \
-               for_each_if ((mask__) & (domain__)->mask)
+#define for_each_fw_domain_masked(domain__, mask__, dev_priv__, tmp__) \
+       for (tmp__ = (mask__); \
+            tmp__ ? (domain__ = 
&(dev_priv__)->uncore.fw_domain[__mask_next_bit(tmp__)]), 1 : 0;)
 
-#define for_each_fw_domain(domain__, dev_priv__) \
-       for_each_fw_domain_masked(domain__, FORCEWAKE_ALL, dev_priv__)
+#define for_each_fw_domain(domain__, dev_priv__, tmp__) \
+       for_each_fw_domain_masked(domain__, (dev_priv__)->uncore.fw_domains, 
dev_priv__, tmp__)
 
 #define CSR_VERSION(major, minor)      ((major) << 16 | (minor))
 #define CSR_VERSION_MAJOR(version)     ((version) >> 16)
@@ -2581,12 +2585,6 @@ static inline struct drm_i915_private 
*huc_to_i915(struct intel_huc *huc)
             (id__)++) \
                for_each_if ((engine__) = (dev_priv__)->engine[(id__)])
 
-#define __mask_next_bit(mask) ({                                       \
-       int __idx = ffs(mask) - 1;                                      \
-       mask &= ~BIT(__idx);                                            \
-       __idx;                                                          \
-})
-
 /* Iterator over subset of engines selected by mask */
 #define for_each_engine_masked(engine__, dev_priv__, mask__, tmp__) \
        for (tmp__ = mask__ & INTEL_INFO(dev_priv__)->ring_mask;        \
diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
b/drivers/gpu/drm/i915/intel_uncore.c
index aa2e7401efdc..2e79ca129202 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -118,13 +118,16 @@ static void
 fw_domains_get(struct drm_i915_private *i915, enum forcewake_domains 
fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
+       unsigned int tmp;
+
+       GEM_BUG_ON(fw_domains & ~i915->uncore.fw_domains);
 
-       for_each_fw_domain_masked(d, fw_domains, i915) {
+       for_each_fw_domain_masked(d, fw_domains, i915, tmp) {
                fw_domain_wait_ack_clear(i915, d);
                fw_domain_get(i915, d);
        }
 
-       for_each_fw_domain_masked(d, fw_domains, i915)
+       for_each_fw_domain_masked(d, fw_domains, i915, tmp)
                fw_domain_wait_ack(i915, d);
 
        i915->uncore.fw_domains_active |= fw_domains;
@@ -134,8 +137,11 @@ static void
 fw_domains_put(struct drm_i915_private *i915, enum forcewake_domains 
fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
+       unsigned int tmp;
+
+       GEM_BUG_ON(fw_domains & ~i915->uncore.fw_domains);
 
-       for_each_fw_domain_masked(d, fw_domains, i915) {
+       for_each_fw_domain_masked(d, fw_domains, i915, tmp) {
                fw_domain_put(i915, d);
                fw_domain_posting_read(i915, d);
        }
@@ -147,9 +153,10 @@ static void
 fw_domains_posting_read(struct drm_i915_private *i915)
 {
        struct intel_uncore_forcewake_domain *d;
+       unsigned int tmp;
 
        /* No need to do for all, just do for first found */
-       for_each_fw_domain(d, i915) {
+       for_each_fw_domain(d, i915, tmp) {
                fw_domain_posting_read(i915, d);
                break;
        }
@@ -160,11 +167,14 @@ fw_domains_reset(struct drm_i915_private *i915,
                 enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
+       unsigned int tmp;
 
-       if (i915->uncore.fw_domains == 0)
+       if (!fw_domains)
                return;
 
-       for_each_fw_domain_masked(d, fw_domains, i915)
+       GEM_BUG_ON(fw_domains & ~i915->uncore.fw_domains);
+
+       for_each_fw_domain_masked(d, fw_domains, i915, tmp)
                fw_domain_reset(i915, d);
 
        fw_domains_posting_read(i915);
@@ -274,9 +284,11 @@ static void intel_uncore_forcewake_reset(struct 
drm_i915_private *dev_priv,
         * timers are run before holding.
         */
        while (1) {
+               unsigned int tmp;
+
                active_domains = 0;
 
-               for_each_fw_domain(domain, dev_priv) {
+               for_each_fw_domain(domain, dev_priv, tmp) {
                        if (hrtimer_cancel(&domain->timer) == 0)
                                continue;
 
@@ -285,7 +297,7 @@ static void intel_uncore_forcewake_reset(struct 
drm_i915_private *dev_priv,
 
                spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-               for_each_fw_domain(domain, dev_priv) {
+               for_each_fw_domain(domain, dev_priv, tmp) {
                        if (hrtimer_active(&domain->timer))
                                active_domains |= domain->mask;
                }
@@ -308,7 +320,7 @@ static void intel_uncore_forcewake_reset(struct 
drm_i915_private *dev_priv,
        if (fw)
                dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
 
-       fw_domains_reset(dev_priv, FORCEWAKE_ALL);
+       fw_domains_reset(dev_priv, dev_priv->uncore.fw_domains);
 
        if (restore) { /* If reset with a user forcewake, try to restore */
                if (fw)
@@ -465,13 +477,13 @@ static void __intel_uncore_forcewake_get(struct 
drm_i915_private *dev_priv,
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
+       unsigned int tmp;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv, tmp)
                if (domain->wake_count++)
                        fw_domains &= ~domain->mask;
-       }
 
        if (fw_domains)
                dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
@@ -528,10 +540,11 @@ static void __intel_uncore_forcewake_put(struct 
drm_i915_private *dev_priv,
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
+       unsigned int tmp;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv, tmp) {
                if (WARN_ON(domain->wake_count == 0))
                        continue;
 
@@ -936,8 +949,11 @@ static noinline void ___force_wake_auto(struct 
drm_i915_private *dev_priv,
                                        enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
+       unsigned int tmp;
+
+       GEM_BUG_ON(fw_domains & ~dev_priv->uncore.fw_domains);
 
-       for_each_fw_domain_masked(domain, fw_domains, dev_priv)
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv, tmp)
                fw_domain_arm_timer(domain);
 
        dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
@@ -1175,7 +1191,7 @@ static void fw_domain_init(struct drm_i915_private 
*dev_priv,
        BUILD_BUG_ON(FORCEWAKE_BLITTER != (1 << FW_DOMAIN_ID_BLITTER));
        BUILD_BUG_ON(FORCEWAKE_MEDIA != (1 << FW_DOMAIN_ID_MEDIA));
 
-       d->mask = 1 << domain_id;
+       d->mask = BIT(domain_id);
 
        hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        d->timer.function = intel_uncore_fw_release_timer;
@@ -1253,9 +1269,9 @@ static void intel_uncore_fw_domains_init(struct 
drm_i915_private *dev_priv)
                               FORCEWAKE_MT, FORCEWAKE_MT_ACK);
 
                spin_lock_irq(&dev_priv->uncore.lock);
-               fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_ALL);
+               fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_RENDER);
                ecobus = __raw_i915_read32(dev_priv, ECOBUS);
-               fw_domains_put_with_fifo(dev_priv, FORCEWAKE_ALL);
+               fw_domains_put_with_fifo(dev_priv, FORCEWAKE_RENDER);
                spin_unlock_irq(&dev_priv->uncore.lock);
 
                if (!(ecobus & FORCEWAKE_MT_ENABLE)) {
-- 
2.11.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to