static inline void
 fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
 {
+       WARN_ON(d->reg_set == 0);
        __raw_i915_write32(d->i915, d->reg_set, d->val_reset);
 }
 
        struct intel_uncore_forcewake_domain *d;
        enum forcewake_domain_id id;
 
+       WARN_ON(dev_priv->uncore.fw_domains == 0);
+
        for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
                fw_domain_reset(d);
 
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
-static void __intel_uncore_early_sanitize(struct drm_device *dev,
-                                         bool restore_forcewake)
+static void intel_uncore_ellc_detect(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (HAS_FPGA_DBG_UNCLAIMED(dev))
-               __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
-
        if ((IS_HASWELL(dev) || IS_BROADWELL(dev)) &&
            (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) {
                /* The docs do not explain exactly how the calculation can be
                dev_priv->ellc_size = 128;
                DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
        }
+}
+
+static void __intel_uncore_early_sanitize(struct drm_device *dev,
+                                         bool restore_forcewake)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       if (HAS_FPGA_DBG_UNCLAIMED(dev))
+               __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
 
        /* clear out old GT FIFO errors */
        if (IS_GEN6(dev) || IS_GEN7(dev))
        setup_timer(&d->timer, intel_uncore_fw_release_timer, (unsigned long)d);
 
        dev_priv->uncore.fw_domains |= (1 << domain_id);
+
+       fw_domain_reset(d);
 }
 
-void intel_uncore_init(struct drm_device *dev)
+static void intel_uncore_fw_domains_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       __intel_uncore_early_sanitize(dev, false);
-
        if (IS_GEN9(dev)) {
                dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
                dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
                dev_priv->uncore.funcs.force_wake_put =
                        fw_domains_put_with_fifo;
 
+               /* We need to init first for ECOBUS access and then
+                * determine later if we want to reinit, in case of MT access is
+                * not working
+                */
                fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
                               FORCEWAKE_MT, FORCEWAKE_MT_ACK);
+
                mutex_lock(&dev->struct_mutex);
                fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_ALL);
                ecobus = __raw_i915_read32(dev_priv, ECOBUS);
                fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
                               FORCEWAKE, FORCEWAKE_ACK);
        }
+}
+
+void intel_uncore_init(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       intel_uncore_ellc_detect(dev);
+       intel_uncore_fw_domains_init(dev);
+       __intel_uncore_early_sanitize(dev, false);
 
        switch (INTEL_INFO(dev)->gen) {
        default: