[Intel-gfx] [PATCH v2] drm/i915: Report the failure to write to the punit

Mika Kuoppala mika.kuoppala at linux.intel.com
Thu Jan 26 13:25:25 UTC 2017


Chris Wilson <chris at chris-wilson.co.uk> writes:

> The write to the punit may fail, so propagate the error code back to its
> callers. Of particular interest are the RPS writes, so add appropriate
> user error codes and logging.
>
> v2: Add DEBUG for failed frequency changes during RPS.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-by: Mika Kuoppala <mika.kuoppala at intel.com>

> Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_debugfs.c   |  6 +++--
>  drivers/gpu/drm/i915/i915_drv.h       |  4 ++--
>  drivers/gpu/drm/i915/i915_irq.c       |  5 +++-
>  drivers/gpu/drm/i915/i915_sysfs.c     |  9 ++++---
>  drivers/gpu/drm/i915/intel_pm.c       | 45 +++++++++++++++++++++++++----------
>  drivers/gpu/drm/i915/intel_sideband.c | 10 +++++---
>  6 files changed, 53 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index c041a2ae9af0..aebd456edec1 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -4272,7 +4272,8 @@ i915_max_freq_set(void *data, u64 val)
>  
>  	dev_priv->rps.max_freq_softlimit = val;
>  
> -	intel_set_rps(dev_priv, val);
> +	if (intel_set_rps(dev_priv, val))
> +		DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
>  
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  
> @@ -4327,7 +4328,8 @@ i915_min_freq_set(void *data, u64 val)
>  
>  	dev_priv->rps.min_freq_softlimit = val;
>  
> -	intel_set_rps(dev_priv, val);
> +	if (intel_set_rps(dev_priv, val))
> +		DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
>  
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index ef5af3c7a14a..1c5145d0e53d 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3766,7 +3766,7 @@ extern void i915_redisable_vga(struct drm_i915_private *dev_priv);
>  extern void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv);
>  extern bool ironlake_set_drps(struct drm_i915_private *dev_priv, u8 val);
>  extern void intel_init_pch_refclk(struct drm_i915_private *dev_priv);
> -extern void intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
> +extern int intel_set_rps(struct drm_i915_private *dev_priv, u8 val);
>  extern bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
>  				  bool enable);
>  
> @@ -3792,7 +3792,7 @@ int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request,
>  
>  /* intel_sideband.c */
>  u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr);
> -void vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val);
> +int vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val);
>  u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr);
>  u32 vlv_iosf_sb_read(struct drm_i915_private *dev_priv, u8 port, u32 reg);
>  void vlv_iosf_sb_write(struct drm_i915_private *dev_priv, u8 port, u32 reg, u32 val);
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 59865654f552..145bee0aa57d 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1234,7 +1234,10 @@ static void gen6_pm_rps_work(struct work_struct *work)
>  	new_delay += adj;
>  	new_delay = clamp_t(int, new_delay, min, max);
>  
> -	intel_set_rps(dev_priv, new_delay);
> +	if (intel_set_rps(dev_priv, new_delay)) {
> +		DRM_DEBUG_DRIVER("Failed to set new GPU frequency\n");
> +		dev_priv->rps.last_adj = 0;
> +	}
>  
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  }
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index 376ac957cd1c..a721ff116101 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -395,13 +395,13 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
>  	/* We still need *_set_rps to process the new max_delay and
>  	 * update the interrupt limits and PMINTRMSK even though
>  	 * frequency request may be unchanged. */
> -	intel_set_rps(dev_priv, val);
> +	ret = intel_set_rps(dev_priv, val);
>  
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  
>  	intel_runtime_pm_put(dev_priv);
>  
> -	return count;
> +	return ret ?: count;
>  }
>  
>  static ssize_t gt_min_freq_mhz_show(struct device *kdev, struct device_attribute *attr, char *buf)
> @@ -448,14 +448,13 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
>  	/* We still need *_set_rps to process the new min_delay and
>  	 * update the interrupt limits and PMINTRMSK even though
>  	 * frequency request may be unchanged. */
> -	intel_set_rps(dev_priv, val);
> +	ret = intel_set_rps(dev_priv, val);
>  
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  
>  	intel_runtime_pm_put(dev_priv);
>  
> -	return count;
> -
> +	return ret ?: count;
>  }
>  
>  static DEVICE_ATTR(gt_act_freq_mhz, S_IRUGO, gt_act_freq_mhz_show, NULL);
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 25c2652e1e11..798787c5df9e 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -4933,7 +4933,7 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val)
>  /* gen6_set_rps is called to update the frequency request, but should also be
>   * called when the range (min_delay and max_delay) is modified so that we can
>   * update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */
> -static void gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
> +static int gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  {
>  	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
>  	WARN_ON(val > dev_priv->rps.max_freq);
> @@ -4968,10 +4968,14 @@ static void gen6_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  
>  	dev_priv->rps.cur_freq = val;
>  	trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val));
> +
> +	return 0;
>  }
>  
> -static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
> +static int valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  {
> +	int err;
> +
>  	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
>  	WARN_ON(val > dev_priv->rps.max_freq);
>  	WARN_ON(val < dev_priv->rps.min_freq);
> @@ -4983,13 +4987,18 @@ static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  	I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val));
>  
>  	if (val != dev_priv->rps.cur_freq) {
> -		vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val);
> +		err = vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val);
> +		if (err)
> +			return err;
> +
>  		if (!IS_CHERRYVIEW(dev_priv))
>  			gen6_set_rps_thresholds(dev_priv, val);
>  	}
>  
>  	dev_priv->rps.cur_freq = val;
>  	trace_intel_gpu_freq_change(intel_gpu_freq(dev_priv, val));
> +
> +	return 0;
>  }
>  
>  /* vlv_set_rps_idle: Set the frequency to idle, if Gfx clocks are down
> @@ -5002,6 +5011,7 @@ static void valleyview_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
>  {
>  	u32 val = dev_priv->rps.idle_freq;
> +	int err;
>  
>  	if (dev_priv->rps.cur_freq <= val)
>  		return;
> @@ -5019,8 +5029,11 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
>  	 * power than the render powerwell.
>  	 */
>  	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_MEDIA);
> -	valleyview_set_rps(dev_priv, val);
> +	err = valleyview_set_rps(dev_priv, val);
>  	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_MEDIA);
> +
> +	if (err)
> +		DRM_ERROR("Failed to set RPS for idle\n");
>  }
>  
>  void gen6_rps_busy(struct drm_i915_private *dev_priv)
> @@ -5035,10 +5048,11 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv)
>  		gen6_enable_rps_interrupts(dev_priv);
>  
>  		/* Ensure we start at the user's desired frequency */
> -		intel_set_rps(dev_priv,
> -			      clamp(dev_priv->rps.cur_freq,
> -				    dev_priv->rps.min_freq_softlimit,
> -				    dev_priv->rps.max_freq_softlimit));
> +		if (intel_set_rps(dev_priv,
> +				  clamp(dev_priv->rps.cur_freq,
> +					dev_priv->rps.min_freq_softlimit,
> +					dev_priv->rps.max_freq_softlimit)))
> +			DRM_DEBUG_DRIVER("Failed to set idle frequency\n");
>  	}
>  	mutex_unlock(&dev_priv->rps.hw_lock);
>  }
> @@ -5106,12 +5120,16 @@ void gen6_rps_boost(struct drm_i915_private *dev_priv,
>  	spin_unlock(&dev_priv->rps.client_lock);
>  }
>  
> -void intel_set_rps(struct drm_i915_private *dev_priv, u8 val)
> +int intel_set_rps(struct drm_i915_private *dev_priv, u8 val)
>  {
> +	int err;
> +
>  	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> -		valleyview_set_rps(dev_priv, val);
> +		err = valleyview_set_rps(dev_priv, val);
>  	else
> -		gen6_set_rps(dev_priv, val);
> +		err = gen6_set_rps(dev_priv, val);
> +
> +	return err;
>  }
>  
>  static void gen9_disable_rc6(struct drm_i915_private *dev_priv)
> @@ -5315,7 +5333,7 @@ static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv)
>  }
>  
>  static void reset_rps(struct drm_i915_private *dev_priv,
> -		      void (*set)(struct drm_i915_private *, u8))
> +		      int (*set)(struct drm_i915_private *, u8))
>  {
>  	u8 freq = dev_priv->rps.cur_freq;
>  
> @@ -5323,7 +5341,8 @@ static void reset_rps(struct drm_i915_private *dev_priv,
>  	dev_priv->rps.power = -1;
>  	dev_priv->rps.cur_freq = -1;
>  
> -	set(dev_priv, freq);
> +	if (set(dev_priv, freq))
> +		DRM_ERROR("Failed to reset RPS to initial values\n");
>  }
>  
>  /* See the Gen9_GT_PM_Programming_Guide doc for the below */
> diff --git a/drivers/gpu/drm/i915/intel_sideband.c b/drivers/gpu/drm/i915/intel_sideband.c
> index 1a840bf92eea..d3d49a09c919 100644
> --- a/drivers/gpu/drm/i915/intel_sideband.c
> +++ b/drivers/gpu/drm/i915/intel_sideband.c
> @@ -93,14 +93,18 @@ u32 vlv_punit_read(struct drm_i915_private *dev_priv, u32 addr)
>  	return val;
>  }
>  
> -void vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val)
> +int vlv_punit_write(struct drm_i915_private *dev_priv, u32 addr, u32 val)
>  {
> +	int err;
> +
>  	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
>  
>  	mutex_lock(&dev_priv->sb_lock);
> -	vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT,
> -			SB_CRWRDA_NP, addr, &val);
> +	err = vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT,
> +			      SB_CRWRDA_NP, addr, &val);
>  	mutex_unlock(&dev_priv->sb_lock);
> +
> +	return err;
>  }
>  
>  u32 vlv_bunit_read(struct drm_i915_private *dev_priv, u32 reg)
> -- 
> 2.11.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list