[alsa-devel] [PATCH] drm/i915, HD-audio: Don't continue probing when nomodeset is given

Daniel Vetter daniel at ffwll.ch
Fri Jun 13 18:07:06 CEST 2014


On Fri, Jun 13, 2014 at 05:56:02PM +0200, Takashi Iwai wrote:
> When a machine is booted with nomodeset option, i915 driver skips the
> whole initialization.  Meanwhile, HD-audio tries to bind wth i915 just
> by request_symbol() without knowing that the initialization was
> skipped, and eventually it hits WARN_ON() in i915_request_power_well()
> and i915_release_power_well() wrongly but still continues probing,
> even though it doesn't work at all.
> 
> In this patch, both functions are changed to return an error in case
> of uninitialized state instead of WARN_ON(), so that HD-audio driver
> can give up HDMI controller initialization at the right time.
> 
> Cc: <stable at vger.kernel.org> [3.15]
> Signed-off-by: Takashi Iwai <tiwai at suse.de>

Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>

I guess you'll merge this through the sound tree?
-Daniel

> ---
> 
> The bug actually exists since 3.11, but this commit will be applicable
> only to recent kernels due to ALSA and i915 code changes, that's why
> marked with [3.15] for stable.
> 
>  drivers/gpu/drm/i915/intel_pm.c | 14 ++++++++------
>  include/drm/i915_powerwell.h    |  4 ++--
>  sound/pci/hda/hda_i915.c        | 12 ++++++------
>  sound/pci/hda/hda_i915.h        |  4 ++--
>  sound/pci/hda/hda_intel.c       |  7 ++++++-
>  5 files changed, 24 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index d93dcf683e8c..0d6bd247009b 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -5706,30 +5706,32 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
>  static struct i915_power_domains *hsw_pwr;
>  
>  /* Display audio driver power well request */
> -void i915_request_power_well(void)
> +int i915_request_power_well(void)
>  {
>  	struct drm_i915_private *dev_priv;
>  
> -	if (WARN_ON(!hsw_pwr))
> -		return;
> +	if (!hsw_pwr)
> +		return -ENODEV;
>  
>  	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
>  				power_domains);
>  	intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
> +	return 0;
>  }
>  EXPORT_SYMBOL_GPL(i915_request_power_well);
>  
>  /* Display audio driver power well release */
> -void i915_release_power_well(void)
> +int i915_release_power_well(void)
>  {
>  	struct drm_i915_private *dev_priv;
>  
> -	if (WARN_ON(!hsw_pwr))
> -		return;
> +	if (!hsw_pwr)
> +		return -ENODEV;
>  
>  	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
>  				power_domains);
>  	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
> +	return 0;
>  }
>  EXPORT_SYMBOL_GPL(i915_release_power_well);
>  
> diff --git a/include/drm/i915_powerwell.h b/include/drm/i915_powerwell.h
> index cfdc884405b7..2baba9996094 100644
> --- a/include/drm/i915_powerwell.h
> +++ b/include/drm/i915_powerwell.h
> @@ -30,7 +30,7 @@
>  #define _I915_POWERWELL_H_
>  
>  /* For use by hda_i915 driver */
> -extern void i915_request_power_well(void);
> -extern void i915_release_power_well(void);
> +extern int i915_request_power_well(void);
> +extern int i915_release_power_well(void);
>  
>  #endif				/* _I915_POWERWELL_H_ */
> diff --git a/sound/pci/hda/hda_i915.c b/sound/pci/hda/hda_i915.c
> index 9d07e4edacdb..e9e8a4a4a9a1 100644
> --- a/sound/pci/hda/hda_i915.c
> +++ b/sound/pci/hda/hda_i915.c
> @@ -22,20 +22,20 @@
>  #include <drm/i915_powerwell.h>
>  #include "hda_i915.h"
>  
> -static void (*get_power)(void);
> -static void (*put_power)(void);
> +static int (*get_power)(void);
> +static int (*put_power)(void);
>  
> -void hda_display_power(bool enable)
> +int hda_display_power(bool enable)
>  {
>  	if (!get_power || !put_power)
> -		return;
> +		return -ENODEV;
>  
>  	pr_debug("HDA display power %s \n",
>  			enable ? "Enable" : "Disable");
>  	if (enable)
> -		get_power();
> +		return get_power();
>  	else
> -		put_power();
> +		return put_power();
>  }
>  
>  int hda_i915_init(void)
> diff --git a/sound/pci/hda/hda_i915.h b/sound/pci/hda/hda_i915.h
> index 5a63da2c53e5..bfd835f8f1aa 100644
> --- a/sound/pci/hda/hda_i915.h
> +++ b/sound/pci/hda/hda_i915.h
> @@ -17,11 +17,11 @@
>  #define __SOUND_HDA_I915_H
>  
>  #ifdef CONFIG_SND_HDA_I915
> -void hda_display_power(bool enable);
> +int hda_display_power(bool enable);
>  int hda_i915_init(void);
>  int hda_i915_exit(void);
>  #else
> -static inline void hda_display_power(bool enable) {}
> +static inline int hda_display_power(bool enable) { return 0; }
>  static inline int hda_i915_init(void)
>  {
>  	return -ENODEV;
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index bb65a124e006..23fd6b9aecca 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1656,8 +1656,13 @@ static int azx_probe_continue(struct azx *chip)
>  				"Error request power-well from i915\n");
>  			goto out_free;
>  		}
> +		err = hda_display_power(true);
> +		if (err < 0) {
> +			dev_err(chip->card->dev,
> +				"Cannot turn on display power on i915\n");
> +			goto out_free;
> +		}
>  #endif
> -		hda_display_power(true);
>  	}
>  
>  	err = azx_first_init(chip);
> -- 
> 1.9.3
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the Alsa-devel mailing list