diff mbox series

[3/9] drm/i915: add uncore flags for unclaimed mmio

Message ID 20190325214940.23632-4-daniele.ceraolospurio@intel.com (mailing list archive)
State New, archived
Headers show
Series more uncore rework | expand

Commit Message

Daniele Ceraolo Spurio March 25, 2019, 9:49 p.m. UTC
Save the HW capabilities to avoid having to jump back to dev_priv
every time.

Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_drv.c               |  4 +-
 drivers/gpu/drm/i915/intel_display.c          |  2 +-
 drivers/gpu/drm/i915/intel_hangcheck.c        |  2 +-
 drivers/gpu/drm/i915/intel_uncore.c           | 57 ++++++++++---------
 drivers/gpu/drm/i915/intel_uncore.h           |  7 ++-
 drivers/gpu/drm/i915/selftests/intel_uncore.c | 15 ++---
 6 files changed, 47 insertions(+), 40 deletions(-)

Comments

Zanoni, Paulo R March 26, 2019, 12:19 a.m. UTC | #1
Em seg, 2019-03-25 às 14:49 -0700, Daniele Ceraolo Spurio escreveu:
> Save the HW capabilities to avoid having to jump back to dev_priv
> every time.
> 

Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>

> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_drv.c               |  4 +-
>  drivers/gpu/drm/i915/intel_display.c          |  2 +-
>  drivers/gpu/drm/i915/intel_hangcheck.c        |  2 +-
>  drivers/gpu/drm/i915/intel_uncore.c           | 57 ++++++++++---------
>  drivers/gpu/drm/i915/intel_uncore.h           |  7 ++-
>  drivers/gpu/drm/i915/selftests/intel_uncore.c | 15 ++---
>  6 files changed, 47 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 5465b99b4392..85e80701a4c6 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -2854,7 +2854,7 @@ static int intel_runtime_suspend(struct device *kdev)
>  	enable_rpm_wakeref_asserts(dev_priv);
>  	intel_runtime_pm_cleanup(dev_priv);
>  
> -	if (intel_uncore_arm_unclaimed_mmio_detection(dev_priv))
> +	if (intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore))
>  		DRM_ERROR("Unclaimed access detected prior to suspending\n");
>  
>  	dev_priv->runtime_pm.suspended = true;
> @@ -2908,7 +2908,7 @@ static int intel_runtime_resume(struct device *kdev)
>  
>  	intel_opregion_notify_adapter(dev_priv, PCI_D0);
>  	dev_priv->runtime_pm.suspended = false;
> -	if (intel_uncore_unclaimed_mmio(dev_priv))
> +	if (intel_uncore_unclaimed_mmio(&dev_priv->uncore))
>  		DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n");
>  
>  	if (INTEL_GEN(dev_priv) >= 11) {
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 008560ef4db0..9a9b78c120b1 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -13533,7 +13533,7 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
>  		 * so enable debugging for the next modeset - and hope we catch
>  		 * the culprit.
>  		 */
> -		intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
> +		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
>  		intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
>  	}
>  
> diff --git a/drivers/gpu/drm/i915/intel_hangcheck.c b/drivers/gpu/drm/i915/intel_hangcheck.c
> index 57ed49dc19c4..125662c64934 100644
> --- a/drivers/gpu/drm/i915/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/intel_hangcheck.c
> @@ -270,7 +270,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
>  	 * periodically arm the mmio checker to see if we are triggering
>  	 * any invalid access.
>  	 */
> -	intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
> +	intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
>  
>  	for_each_engine(engine, dev_priv, id) {
>  		struct hangcheck hc;
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 0259a61a745f..1a327828f220 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -509,18 +509,17 @@ gen6_check_for_fifo_debug(struct intel_uncore *uncore)
>  }
>  
>  static bool
> -check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
> +check_for_unclaimed_mmio(struct intel_uncore *uncore)
>  {
> -	struct intel_uncore *uncore = &dev_priv->uncore;
>  	bool ret = false;
>  
> -	if (HAS_FPGA_DBG_UNCLAIMED(dev_priv))
> +	if (uncore->flags & UNCORE_HAS_FPGA_DBG_UNCLAIMED)
>  		ret |= fpga_check_for_unclaimed_mmio(uncore);
>  
> -	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> +	if (uncore->flags & UNCORE_HAS_DBG_UNCLAIMED)
>  		ret |= vlv_check_for_unclaimed_mmio(uncore);
>  
> -	if (IS_GEN_RANGE(dev_priv, 6, 7))
> +	if (uncore->flags & UNCORE_HAS_FIFO)
>  		ret |= gen6_check_for_fifo_debug(uncore);
>  
>  	return ret;
> @@ -529,14 +528,12 @@ check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
>  static void __intel_uncore_early_sanitize(struct intel_uncore *uncore,
>  					  unsigned int restore_forcewake)
>  {
> -	struct drm_i915_private *i915 = uncore_to_i915(uncore);
> -
>  	/* clear out unclaimed reg detection bit */
> -	if (check_for_unclaimed_mmio(i915))
> +	if (check_for_unclaimed_mmio(uncore))
>  		DRM_DEBUG("unclaimed mmio detected on uncore init, clearing\n");
>  
>  	/* WaDisableShadowRegForCpd:chv */
> -	if (IS_CHERRYVIEW(i915)) {
> +	if (IS_CHERRYVIEW(uncore_to_i915(uncore))) {
>  		__raw_uncore_write32(uncore, GTFIFOCTL,
>  				     __raw_uncore_read32(uncore, GTFIFOCTL) |
>  				     GT_FIFO_CTL_BLOCK_ALL_POLICY_STALL |
> @@ -549,7 +546,7 @@ static void __intel_uncore_early_sanitize(struct intel_uncore *uncore,
>  		spin_lock_irq(&uncore->lock);
>  		uncore->funcs.force_wake_get(uncore, restore_forcewake);
>  
> -		if (IS_GEN_RANGE(i915, 6, 7))
> +		if (uncore->flags & UNCORE_HAS_FIFO)
>  			uncore->fifo_count = fifo_free_entries(uncore);
>  		spin_unlock_irq(&uncore->lock);
>  	}
> @@ -668,12 +665,10 @@ void intel_uncore_forcewake_user_get(struct intel_uncore *uncore)
>   */
>  void intel_uncore_forcewake_user_put(struct intel_uncore *uncore)
>  {
> -	struct drm_i915_private *i915 = uncore_to_i915(uncore);
> -
>  	spin_lock_irq(&uncore->lock);
>  	if (!--uncore->user_forcewake.count) {
> -		if (intel_uncore_unclaimed_mmio(i915))
> -			dev_info(i915->drm.dev,
> +		if (intel_uncore_unclaimed_mmio(uncore))
> +			dev_info(uncore_to_i915(uncore)->drm.dev,
>  				 "Invalid mmio detected during user access\n");
>  
>  		uncore->unclaimed_mmio_check =
> @@ -1072,12 +1067,12 @@ ilk_dummy_write(struct intel_uncore *uncore)
>  }
>  
>  static void
> -__unclaimed_reg_debug(struct drm_i915_private *dev_priv,
> +__unclaimed_reg_debug(struct intel_uncore *uncore,
>  		      const i915_reg_t reg,
>  		      const bool read,
>  		      const bool before)
>  {
> -	if (WARN(check_for_unclaimed_mmio(dev_priv) && !before,
> +	if (WARN(check_for_unclaimed_mmio(uncore) && !before,
>  		 "Unclaimed %s register 0x%x\n",
>  		 read ? "read from" : "write to",
>  		 i915_mmio_reg_offset(reg)))
> @@ -1086,7 +1081,7 @@ __unclaimed_reg_debug(struct drm_i915_private *dev_priv,
>  }
>  
>  static inline void
> -unclaimed_reg_debug(struct drm_i915_private *dev_priv,
> +unclaimed_reg_debug(struct intel_uncore *uncore,
>  		    const i915_reg_t reg,
>  		    const bool read,
>  		    const bool before)
> @@ -1094,7 +1089,7 @@ unclaimed_reg_debug(struct drm_i915_private *dev_priv,
>  	if (likely(!i915_modparams.mmio_debug))
>  		return;
>  
> -	__unclaimed_reg_debug(dev_priv, reg, read, before);
> +	__unclaimed_reg_debug(uncore, reg, read, before);
>  }
>  
>  #define GEN2_READ_HEADER(x) \
> @@ -1145,10 +1140,10 @@ __gen2_read(64)
>  	u##x val = 0; \
>  	assert_rpm_wakelock_held(dev_priv); \
>  	spin_lock_irqsave(&uncore->lock, irqflags); \
> -	unclaimed_reg_debug(dev_priv, reg, true, true)
> +	unclaimed_reg_debug(uncore, reg, true, true)
>  
>  #define GEN6_READ_FOOTER \
> -	unclaimed_reg_debug(dev_priv, reg, true, false); \
> +	unclaimed_reg_debug(uncore, reg, true, false); \
>  	spin_unlock_irqrestore(&uncore->lock, irqflags); \
>  	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
>  	return val
> @@ -1259,10 +1254,10 @@ __gen2_write(32)
>  	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
>  	assert_rpm_wakelock_held(dev_priv); \
>  	spin_lock_irqsave(&uncore->lock, irqflags); \
> -	unclaimed_reg_debug(dev_priv, reg, false, true)
> +	unclaimed_reg_debug(uncore, reg, false, true)
>  
>  #define GEN6_WRITE_FOOTER \
> -	unclaimed_reg_debug(dev_priv, reg, false, false); \
> +	unclaimed_reg_debug(uncore, reg, false, false); \
>  	spin_unlock_irqrestore(&uncore->lock, irqflags)
>  
>  #define __gen6_write(x) \
> @@ -1638,6 +1633,15 @@ int intel_uncore_init(struct intel_uncore *uncore)
>  		ASSIGN_READ_MMIO_VFUNCS(uncore, gen11_fwtable);
>  	}
>  
> +	if (HAS_FPGA_DBG_UNCLAIMED(i915))
> +		uncore->flags |= UNCORE_HAS_FPGA_DBG_UNCLAIMED;
> +
> +	if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
> +		uncore->flags |= UNCORE_HAS_DBG_UNCLAIMED;
> +
> +	if (IS_GEN_RANGE(i915, 6, 7))
> +		uncore->flags |= UNCORE_HAS_FIFO;
> +
>  	iosf_mbi_register_pmic_bus_access_notifier(&uncore->pmic_bus_access_nb);
>  
>  	return 0;
> @@ -1869,15 +1873,14 @@ int __intel_wait_for_register(struct drm_i915_private *dev_priv,
>  	return ret;
>  }
>  
> -bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv)
> +bool intel_uncore_unclaimed_mmio(struct intel_uncore *uncore)
>  {
> -	return check_for_unclaimed_mmio(dev_priv);
> +	return check_for_unclaimed_mmio(uncore);
>  }
>  
>  bool
> -intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
> +intel_uncore_arm_unclaimed_mmio_detection(struct intel_uncore *uncore)
>  {
> -	struct intel_uncore *uncore = &dev_priv->uncore;
>  	bool ret = false;
>  
>  	spin_lock_irq(&uncore->lock);
> @@ -1885,7 +1888,7 @@ intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
>  	if (unlikely(uncore->unclaimed_mmio_check <= 0))
>  		goto out;
>  
> -	if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) {
> +	if (unlikely(intel_uncore_unclaimed_mmio(uncore))) {
>  		if (!i915_modparams.mmio_debug) {
>  			DRM_DEBUG("Unclaimed register detected, "
>  				  "enabling oneshot unclaimed register reporting. "
> diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
> index 4947542c6ea7..9a2c4f3b87f2 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.h
> +++ b/drivers/gpu/drm/i915/intel_uncore.h
> @@ -130,6 +130,9 @@ struct intel_uncore {
>  
>  	u32 flags;
>  #define UNCORE_HAS_FORCEWAKE		BIT(0)
> +#define UNCORE_HAS_FPGA_DBG_UNCLAIMED	BIT(1)
> +#define UNCORE_HAS_DBG_UNCLAIMED	BIT(2)
> +#define UNCORE_HAS_FIFO			BIT(3)
>  };
>  
>  /* Iterate over initialised fw domains */
> @@ -149,8 +152,8 @@ forcewake_domain_to_uncore(const struct intel_uncore_forcewake_domain *d)
>  void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
>  int intel_uncore_init(struct intel_uncore *uncore);
>  void intel_uncore_prune(struct intel_uncore *uncore);
> -bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
> -bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
> +bool intel_uncore_unclaimed_mmio(struct intel_uncore *uncore);
> +bool intel_uncore_arm_unclaimed_mmio_detection(struct intel_uncore *uncore);
>  void intel_uncore_fini(struct intel_uncore *uncore);
>  void intel_uncore_suspend(struct intel_uncore *uncore);
>  void intel_uncore_resume_early(struct intel_uncore *uncore);
> diff --git a/drivers/gpu/drm/i915/selftests/intel_uncore.c b/drivers/gpu/drm/i915/selftests/intel_uncore.c
> index c69a1bad8933..799aeedac91b 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_uncore.c
> @@ -244,6 +244,7 @@ static int live_forcewake_domains(void *arg)
>  {
>  #define FW_RANGE 0x40000
>  	struct drm_i915_private *dev_priv = arg;
> +	struct intel_uncore *uncore = &dev_priv->uncore;
>  	unsigned long *valid;
>  	u32 offset;
>  	int err;
> @@ -263,31 +264,31 @@ static int live_forcewake_domains(void *arg)
>  	if (!valid)
>  		return -ENOMEM;
>  
> -	intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
> +	intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL);
>  
> -	check_for_unclaimed_mmio(dev_priv);
> +	check_for_unclaimed_mmio(uncore);
>  	for (offset = 0; offset < FW_RANGE; offset += 4) {
>  		i915_reg_t reg = { offset };
>  
>  		(void)I915_READ_FW(reg);
> -		if (!check_for_unclaimed_mmio(dev_priv))
> +		if (!check_for_unclaimed_mmio(uncore))
>  			set_bit(offset, valid);
>  	}
>  
> -	intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
> +	intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL);
>  
>  	err = 0;
>  	for_each_set_bit(offset, valid, FW_RANGE) {
>  		i915_reg_t reg = { offset };
>  
>  		iosf_mbi_punit_acquire();
> -		intel_uncore_forcewake_reset(&dev_priv->uncore);
> +		intel_uncore_forcewake_reset(uncore);
>  		iosf_mbi_punit_release();
>  
> -		check_for_unclaimed_mmio(dev_priv);
> +		check_for_unclaimed_mmio(uncore);
>  
>  		(void)I915_READ(reg);
> -		if (check_for_unclaimed_mmio(dev_priv)) {
> +		if (check_for_unclaimed_mmio(uncore)) {
>  			pr_err("Unclaimed mmio read to register 0x%04x\n",
>  			       offset);
>  			err = -EINVAL;
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 5465b99b4392..85e80701a4c6 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2854,7 +2854,7 @@  static int intel_runtime_suspend(struct device *kdev)
 	enable_rpm_wakeref_asserts(dev_priv);
 	intel_runtime_pm_cleanup(dev_priv);
 
-	if (intel_uncore_arm_unclaimed_mmio_detection(dev_priv))
+	if (intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore))
 		DRM_ERROR("Unclaimed access detected prior to suspending\n");
 
 	dev_priv->runtime_pm.suspended = true;
@@ -2908,7 +2908,7 @@  static int intel_runtime_resume(struct device *kdev)
 
 	intel_opregion_notify_adapter(dev_priv, PCI_D0);
 	dev_priv->runtime_pm.suspended = false;
-	if (intel_uncore_unclaimed_mmio(dev_priv))
+	if (intel_uncore_unclaimed_mmio(&dev_priv->uncore))
 		DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n");
 
 	if (INTEL_GEN(dev_priv) >= 11) {
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 008560ef4db0..9a9b78c120b1 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -13533,7 +13533,7 @@  static void intel_atomic_commit_tail(struct drm_atomic_state *state)
 		 * so enable debugging for the next modeset - and hope we catch
 		 * the culprit.
 		 */
-		intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
+		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
 		intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET, wakeref);
 	}
 
diff --git a/drivers/gpu/drm/i915/intel_hangcheck.c b/drivers/gpu/drm/i915/intel_hangcheck.c
index 57ed49dc19c4..125662c64934 100644
--- a/drivers/gpu/drm/i915/intel_hangcheck.c
+++ b/drivers/gpu/drm/i915/intel_hangcheck.c
@@ -270,7 +270,7 @@  static void i915_hangcheck_elapsed(struct work_struct *work)
 	 * periodically arm the mmio checker to see if we are triggering
 	 * any invalid access.
 	 */
-	intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
+	intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);
 
 	for_each_engine(engine, dev_priv, id) {
 		struct hangcheck hc;
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 0259a61a745f..1a327828f220 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -509,18 +509,17 @@  gen6_check_for_fifo_debug(struct intel_uncore *uncore)
 }
 
 static bool
-check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
+check_for_unclaimed_mmio(struct intel_uncore *uncore)
 {
-	struct intel_uncore *uncore = &dev_priv->uncore;
 	bool ret = false;
 
-	if (HAS_FPGA_DBG_UNCLAIMED(dev_priv))
+	if (uncore->flags & UNCORE_HAS_FPGA_DBG_UNCLAIMED)
 		ret |= fpga_check_for_unclaimed_mmio(uncore);
 
-	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+	if (uncore->flags & UNCORE_HAS_DBG_UNCLAIMED)
 		ret |= vlv_check_for_unclaimed_mmio(uncore);
 
-	if (IS_GEN_RANGE(dev_priv, 6, 7))
+	if (uncore->flags & UNCORE_HAS_FIFO)
 		ret |= gen6_check_for_fifo_debug(uncore);
 
 	return ret;
@@ -529,14 +528,12 @@  check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
 static void __intel_uncore_early_sanitize(struct intel_uncore *uncore,
 					  unsigned int restore_forcewake)
 {
-	struct drm_i915_private *i915 = uncore_to_i915(uncore);
-
 	/* clear out unclaimed reg detection bit */
-	if (check_for_unclaimed_mmio(i915))
+	if (check_for_unclaimed_mmio(uncore))
 		DRM_DEBUG("unclaimed mmio detected on uncore init, clearing\n");
 
 	/* WaDisableShadowRegForCpd:chv */
-	if (IS_CHERRYVIEW(i915)) {
+	if (IS_CHERRYVIEW(uncore_to_i915(uncore))) {
 		__raw_uncore_write32(uncore, GTFIFOCTL,
 				     __raw_uncore_read32(uncore, GTFIFOCTL) |
 				     GT_FIFO_CTL_BLOCK_ALL_POLICY_STALL |
@@ -549,7 +546,7 @@  static void __intel_uncore_early_sanitize(struct intel_uncore *uncore,
 		spin_lock_irq(&uncore->lock);
 		uncore->funcs.force_wake_get(uncore, restore_forcewake);
 
-		if (IS_GEN_RANGE(i915, 6, 7))
+		if (uncore->flags & UNCORE_HAS_FIFO)
 			uncore->fifo_count = fifo_free_entries(uncore);
 		spin_unlock_irq(&uncore->lock);
 	}
@@ -668,12 +665,10 @@  void intel_uncore_forcewake_user_get(struct intel_uncore *uncore)
  */
 void intel_uncore_forcewake_user_put(struct intel_uncore *uncore)
 {
-	struct drm_i915_private *i915 = uncore_to_i915(uncore);
-
 	spin_lock_irq(&uncore->lock);
 	if (!--uncore->user_forcewake.count) {
-		if (intel_uncore_unclaimed_mmio(i915))
-			dev_info(i915->drm.dev,
+		if (intel_uncore_unclaimed_mmio(uncore))
+			dev_info(uncore_to_i915(uncore)->drm.dev,
 				 "Invalid mmio detected during user access\n");
 
 		uncore->unclaimed_mmio_check =
@@ -1072,12 +1067,12 @@  ilk_dummy_write(struct intel_uncore *uncore)
 }
 
 static void
-__unclaimed_reg_debug(struct drm_i915_private *dev_priv,
+__unclaimed_reg_debug(struct intel_uncore *uncore,
 		      const i915_reg_t reg,
 		      const bool read,
 		      const bool before)
 {
-	if (WARN(check_for_unclaimed_mmio(dev_priv) && !before,
+	if (WARN(check_for_unclaimed_mmio(uncore) && !before,
 		 "Unclaimed %s register 0x%x\n",
 		 read ? "read from" : "write to",
 		 i915_mmio_reg_offset(reg)))
@@ -1086,7 +1081,7 @@  __unclaimed_reg_debug(struct drm_i915_private *dev_priv,
 }
 
 static inline void
-unclaimed_reg_debug(struct drm_i915_private *dev_priv,
+unclaimed_reg_debug(struct intel_uncore *uncore,
 		    const i915_reg_t reg,
 		    const bool read,
 		    const bool before)
@@ -1094,7 +1089,7 @@  unclaimed_reg_debug(struct drm_i915_private *dev_priv,
 	if (likely(!i915_modparams.mmio_debug))
 		return;
 
-	__unclaimed_reg_debug(dev_priv, reg, read, before);
+	__unclaimed_reg_debug(uncore, reg, read, before);
 }
 
 #define GEN2_READ_HEADER(x) \
@@ -1145,10 +1140,10 @@  __gen2_read(64)
 	u##x val = 0; \
 	assert_rpm_wakelock_held(dev_priv); \
 	spin_lock_irqsave(&uncore->lock, irqflags); \
-	unclaimed_reg_debug(dev_priv, reg, true, true)
+	unclaimed_reg_debug(uncore, reg, true, true)
 
 #define GEN6_READ_FOOTER \
-	unclaimed_reg_debug(dev_priv, reg, true, false); \
+	unclaimed_reg_debug(uncore, reg, true, false); \
 	spin_unlock_irqrestore(&uncore->lock, irqflags); \
 	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
 	return val
@@ -1259,10 +1254,10 @@  __gen2_write(32)
 	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
 	assert_rpm_wakelock_held(dev_priv); \
 	spin_lock_irqsave(&uncore->lock, irqflags); \
-	unclaimed_reg_debug(dev_priv, reg, false, true)
+	unclaimed_reg_debug(uncore, reg, false, true)
 
 #define GEN6_WRITE_FOOTER \
-	unclaimed_reg_debug(dev_priv, reg, false, false); \
+	unclaimed_reg_debug(uncore, reg, false, false); \
 	spin_unlock_irqrestore(&uncore->lock, irqflags)
 
 #define __gen6_write(x) \
@@ -1638,6 +1633,15 @@  int intel_uncore_init(struct intel_uncore *uncore)
 		ASSIGN_READ_MMIO_VFUNCS(uncore, gen11_fwtable);
 	}
 
+	if (HAS_FPGA_DBG_UNCLAIMED(i915))
+		uncore->flags |= UNCORE_HAS_FPGA_DBG_UNCLAIMED;
+
+	if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
+		uncore->flags |= UNCORE_HAS_DBG_UNCLAIMED;
+
+	if (IS_GEN_RANGE(i915, 6, 7))
+		uncore->flags |= UNCORE_HAS_FIFO;
+
 	iosf_mbi_register_pmic_bus_access_notifier(&uncore->pmic_bus_access_nb);
 
 	return 0;
@@ -1869,15 +1873,14 @@  int __intel_wait_for_register(struct drm_i915_private *dev_priv,
 	return ret;
 }
 
-bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv)
+bool intel_uncore_unclaimed_mmio(struct intel_uncore *uncore)
 {
-	return check_for_unclaimed_mmio(dev_priv);
+	return check_for_unclaimed_mmio(uncore);
 }
 
 bool
-intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
+intel_uncore_arm_unclaimed_mmio_detection(struct intel_uncore *uncore)
 {
-	struct intel_uncore *uncore = &dev_priv->uncore;
 	bool ret = false;
 
 	spin_lock_irq(&uncore->lock);
@@ -1885,7 +1888,7 @@  intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
 	if (unlikely(uncore->unclaimed_mmio_check <= 0))
 		goto out;
 
-	if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) {
+	if (unlikely(intel_uncore_unclaimed_mmio(uncore))) {
 		if (!i915_modparams.mmio_debug) {
 			DRM_DEBUG("Unclaimed register detected, "
 				  "enabling oneshot unclaimed register reporting. "
diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
index 4947542c6ea7..9a2c4f3b87f2 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -130,6 +130,9 @@  struct intel_uncore {
 
 	u32 flags;
 #define UNCORE_HAS_FORCEWAKE		BIT(0)
+#define UNCORE_HAS_FPGA_DBG_UNCLAIMED	BIT(1)
+#define UNCORE_HAS_DBG_UNCLAIMED	BIT(2)
+#define UNCORE_HAS_FIFO			BIT(3)
 };
 
 /* Iterate over initialised fw domains */
@@ -149,8 +152,8 @@  forcewake_domain_to_uncore(const struct intel_uncore_forcewake_domain *d)
 void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
 int intel_uncore_init(struct intel_uncore *uncore);
 void intel_uncore_prune(struct intel_uncore *uncore);
-bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
-bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
+bool intel_uncore_unclaimed_mmio(struct intel_uncore *uncore);
+bool intel_uncore_arm_unclaimed_mmio_detection(struct intel_uncore *uncore);
 void intel_uncore_fini(struct intel_uncore *uncore);
 void intel_uncore_suspend(struct intel_uncore *uncore);
 void intel_uncore_resume_early(struct intel_uncore *uncore);
diff --git a/drivers/gpu/drm/i915/selftests/intel_uncore.c b/drivers/gpu/drm/i915/selftests/intel_uncore.c
index c69a1bad8933..799aeedac91b 100644
--- a/drivers/gpu/drm/i915/selftests/intel_uncore.c
+++ b/drivers/gpu/drm/i915/selftests/intel_uncore.c
@@ -244,6 +244,7 @@  static int live_forcewake_domains(void *arg)
 {
 #define FW_RANGE 0x40000
 	struct drm_i915_private *dev_priv = arg;
+	struct intel_uncore *uncore = &dev_priv->uncore;
 	unsigned long *valid;
 	u32 offset;
 	int err;
@@ -263,31 +264,31 @@  static int live_forcewake_domains(void *arg)
 	if (!valid)
 		return -ENOMEM;
 
-	intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
+	intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL);
 
-	check_for_unclaimed_mmio(dev_priv);
+	check_for_unclaimed_mmio(uncore);
 	for (offset = 0; offset < FW_RANGE; offset += 4) {
 		i915_reg_t reg = { offset };
 
 		(void)I915_READ_FW(reg);
-		if (!check_for_unclaimed_mmio(dev_priv))
+		if (!check_for_unclaimed_mmio(uncore))
 			set_bit(offset, valid);
 	}
 
-	intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
+	intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL);
 
 	err = 0;
 	for_each_set_bit(offset, valid, FW_RANGE) {
 		i915_reg_t reg = { offset };
 
 		iosf_mbi_punit_acquire();
-		intel_uncore_forcewake_reset(&dev_priv->uncore);
+		intel_uncore_forcewake_reset(uncore);
 		iosf_mbi_punit_release();
 
-		check_for_unclaimed_mmio(dev_priv);
+		check_for_unclaimed_mmio(uncore);
 
 		(void)I915_READ(reg);
-		if (check_for_unclaimed_mmio(dev_priv)) {
+		if (check_for_unclaimed_mmio(uncore)) {
 			pr_err("Unclaimed mmio read to register 0x%04x\n",
 			       offset);
 			err = -EINVAL;