struct intel_uncore_forcewake_domain {
                struct drm_i915_private *i915;
                enum forcewake_domain_id id;
+               enum forcewake_domains mask;
                unsigned wake_count;
                struct hrtimer timer;
                i915_reg_t reg_set;
 };
 
 /* Iterate over initialised fw domains */
-#define for_each_fw_domain_mask(domain__, mask__, dev_priv__, i__) \
-       for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
-            (i__) < FW_DOMAIN_ID_COUNT; \
-            (i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \
-               for_each_if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
-
-#define for_each_fw_domain(domain__, dev_priv__, i__) \
-       for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__)
+#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(domain__, dev_priv__) \
+       for_each_fw_domain_masked(domain__, FORCEWAKE_ALL, dev_priv__)
 
 #define CSR_VERSION(major, minor)      ((major) << 16 | (minor))
 #define CSR_VERSION_MAJOR(version)     ((version) >> 16)
 
 fw_domains_get(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(d, fw_domains, dev_priv) {
                fw_domain_wait_ack_clear(d);
                fw_domain_get(d);
                fw_domain_wait_ack(d);
 fw_domains_put(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(d, fw_domains, dev_priv) {
                fw_domain_put(d);
                fw_domain_posting_read(d);
        }
 fw_domains_posting_read(struct drm_i915_private *dev_priv)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
        /* No need to do for all, just do for first found */
-       for_each_fw_domain(d, dev_priv, id) {
+       for_each_fw_domain(d, dev_priv) {
                fw_domain_posting_read(d);
                break;
        }
 fw_domains_reset(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
        if (dev_priv->uncore.fw_domains == 0)
                return;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
+       for_each_fw_domain_masked(d, fw_domains, dev_priv)
                fw_domain_reset(d);
 
        fw_domains_posting_read(dev_priv);
        unsigned long irqflags;
        struct intel_uncore_forcewake_domain *domain;
        int retry_count = 100;
-       enum forcewake_domain_id id;
        enum forcewake_domains fw = 0, active_domains;
 
        /* Hold uncore.lock across reset to prevent any register access
        while (1) {
                active_domains = 0;
 
-               for_each_fw_domain(domain, dev_priv, id) {
+               for_each_fw_domain(domain, dev_priv) {
                        if (hrtimer_cancel(&domain->timer) == 0)
                                continue;
 
 
                spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-               for_each_fw_domain(domain, dev_priv, id) {
+               for_each_fw_domain(domain, dev_priv) {
                        if (hrtimer_active(&domain->timer))
-                               active_domains |= (1 << id);
+                               active_domains |= domain->mask;
                }
 
                if (active_domains == 0)
 
        WARN_ON(active_domains);
 
-       for_each_fw_domain(domain, dev_priv, id)
+       for_each_fw_domain(domain, dev_priv)
                if (domain->wake_count)
-                       fw |= 1 << id;
+                       fw |= domain->mask;
 
        if (fw)
                dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_get)
                return;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (domain->wake_count++)
-                       fw_domains &= ~(1 << id);
+                       fw_domains &= ~domain->mask;
        }
 
        if (fw_domains)
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_put)
                return;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (WARN_ON(domain->wake_count == 0))
                        continue;
 
 void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_get)
                return;
 
-       for_each_fw_domain(domain, dev_priv, id)
+       for_each_fw_domain(domain, dev_priv)
                WARN_ON(domain->wake_count);
 }
 
                                     enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (WARN_ON(!fw_domains))
                return;
 
        /* Ideally GCC would be constant-fold and eliminate this loop */
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (domain->wake_count) {
-                       fw_domains &= ~(1 << id);
+                       fw_domains &= ~domain->mask;
                        continue;
                }
 
        d->i915 = dev_priv;
        d->id = domain_id;
 
+       BUILD_BUG_ON(FORCEWAKE_RENDER != (1 << FW_DOMAIN_ID_RENDER));
+       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;
+
        hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        d->timer.function = intel_uncore_fw_release_timer;