|
@@ -359,8 +359,8 @@ intel_uncore_fw_release_timer(struct hrtimer *timer)
|
|
|
}
|
|
|
|
|
|
/* Note callers must have acquired the PUNIT->PMIC bus, before calling this. */
|
|
|
-static void intel_uncore_forcewake_reset(struct drm_i915_private *dev_priv,
|
|
|
- bool restore)
|
|
|
+static unsigned int
|
|
|
+intel_uncore_forcewake_reset(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
unsigned long irqflags;
|
|
|
struct intel_uncore_forcewake_domain *domain;
|
|
@@ -412,20 +412,11 @@ static void intel_uncore_forcewake_reset(struct drm_i915_private *dev_priv,
|
|
|
dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
|
|
|
|
|
|
fw_domains_reset(dev_priv, dev_priv->uncore.fw_domains);
|
|
|
-
|
|
|
- if (restore) { /* If reset with a user forcewake, try to restore */
|
|
|
- if (fw)
|
|
|
- dev_priv->uncore.funcs.force_wake_get(dev_priv, fw);
|
|
|
-
|
|
|
- if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv))
|
|
|
- dev_priv->uncore.fifo_count =
|
|
|
- fifo_free_entries(dev_priv);
|
|
|
- }
|
|
|
-
|
|
|
- if (!restore)
|
|
|
- assert_forcewakes_inactive(dev_priv);
|
|
|
+ assert_forcewakes_inactive(dev_priv);
|
|
|
|
|
|
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
|
|
+
|
|
|
+ return fw; /* track the lost user forcewake domains */
|
|
|
}
|
|
|
|
|
|
static u64 gen9_edram_size(struct drm_i915_private *dev_priv)
|
|
@@ -534,7 +525,7 @@ check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
|
|
|
}
|
|
|
|
|
|
static void __intel_uncore_early_sanitize(struct drm_i915_private *dev_priv,
|
|
|
- bool restore_forcewake)
|
|
|
+ unsigned int restore_forcewake)
|
|
|
{
|
|
|
/* clear out unclaimed reg detection bit */
|
|
|
if (check_for_unclaimed_mmio(dev_priv))
|
|
@@ -549,7 +540,17 @@ static void __intel_uncore_early_sanitize(struct drm_i915_private *dev_priv,
|
|
|
}
|
|
|
|
|
|
iosf_mbi_punit_acquire();
|
|
|
- intel_uncore_forcewake_reset(dev_priv, restore_forcewake);
|
|
|
+ intel_uncore_forcewake_reset(dev_priv);
|
|
|
+ if (restore_forcewake) {
|
|
|
+ spin_lock_irq(&dev_priv->uncore.lock);
|
|
|
+ dev_priv->uncore.funcs.force_wake_get(dev_priv,
|
|
|
+ restore_forcewake);
|
|
|
+
|
|
|
+ if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv))
|
|
|
+ dev_priv->uncore.fifo_count =
|
|
|
+ fifo_free_entries(dev_priv);
|
|
|
+ spin_unlock_irq(&dev_priv->uncore.lock);
|
|
|
+ }
|
|
|
iosf_mbi_punit_release();
|
|
|
}
|
|
|
|
|
@@ -558,13 +559,18 @@ void intel_uncore_suspend(struct drm_i915_private *dev_priv)
|
|
|
iosf_mbi_punit_acquire();
|
|
|
iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
|
|
|
&dev_priv->uncore.pmic_bus_access_nb);
|
|
|
- intel_uncore_forcewake_reset(dev_priv, false);
|
|
|
+ dev_priv->uncore.fw_domains_saved =
|
|
|
+ intel_uncore_forcewake_reset(dev_priv);
|
|
|
iosf_mbi_punit_release();
|
|
|
}
|
|
|
|
|
|
void intel_uncore_resume_early(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
- __intel_uncore_early_sanitize(dev_priv, true);
|
|
|
+ unsigned int restore_forcewake;
|
|
|
+
|
|
|
+ restore_forcewake = fetch_and_zero(&dev_priv->uncore.fw_domains_saved);
|
|
|
+ __intel_uncore_early_sanitize(dev_priv, restore_forcewake);
|
|
|
+
|
|
|
iosf_mbi_register_pmic_bus_access_notifier(
|
|
|
&dev_priv->uncore.pmic_bus_access_nb);
|
|
|
i915_check_and_clear_faults(dev_priv);
|
|
@@ -1545,7 +1551,7 @@ void intel_uncore_init(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
intel_uncore_edram_detect(dev_priv);
|
|
|
intel_uncore_fw_domains_init(dev_priv);
|
|
|
- __intel_uncore_early_sanitize(dev_priv, false);
|
|
|
+ __intel_uncore_early_sanitize(dev_priv, 0);
|
|
|
|
|
|
dev_priv->uncore.unclaimed_mmio_check = 1;
|
|
|
dev_priv->uncore.pmic_bus_access_nb.notifier_call =
|
|
@@ -1632,7 +1638,7 @@ void intel_uncore_fini(struct drm_i915_private *dev_priv)
|
|
|
iosf_mbi_punit_acquire();
|
|
|
iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
|
|
|
&dev_priv->uncore.pmic_bus_access_nb);
|
|
|
- intel_uncore_forcewake_reset(dev_priv, false);
|
|
|
+ intel_uncore_forcewake_reset(dev_priv);
|
|
|
iosf_mbi_punit_release();
|
|
|
}
|
|
|
|