[alsa-devel] [PATCH 2/2] ALSA: HD-Audio: SKL+: force HDaudio legacy or SKL+ driver selection

Takashi Iwai tiwai at suse.de
Sat Dec 8 08:49:58 CET 2018


On Sat, 08 Dec 2018 01:00:39 +0100,
Pierre-Louis Bossart wrote:
> 
> For HDaudio and Skylake drivers, add module parameter "pci_binding"
> 
> When pci_binding == 0 (AUTO), the PCI class/subclass info is used to
> select drivers based on the presence of the DSP.
> 
> pci_binding == 1 (LEGACY) forces the use of the HDAudio legacy driver,
> even if the DSP is present.
> 
> pci_binding == 2 (ASOC) forces the use of the ASOC driver. The
> information on the DSP presence is bypassed.
> 
> The value for the module parameter needs to be identical for both
> drivers. This parameter is intended as a back-up solution if the
> automatic detection fails or when the DSP usage fails. Such cases
> should be reported on the alsa-devel mailing list for analysis.
> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>

In theory, we can put this module option into snd-hda-core that is
used by both legacy and ASoC drivers, too, if we want to have a single
common option.  But it's not always intuitive, so I'm fine to keep the
option to both drivers.

> index 0c76713ac5c0..4e1aee5167a1 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -172,6 +172,9 @@ module_param_array(beep_mode, bool, NULL, 0444);
>  MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
>  			    "(0=off, 1=on) (default=1).");
>  #endif
> +static int skl_pci_binding;
> +module_param_named(pci_binding, skl_pci_binding, int, 0444);
> +MODULE_PARM_DESC(legacy, "PCI binding (0=auto, 1=only legacy, 2=only asoc");

The parameter is "pci_binding", not "legacy", right?
The same error is seen in asoc skl.


>  #ifdef CONFIG_PM
>  static int param_set_xint(const char *val, const struct kernel_param *kp);
> @@ -2093,9 +2096,25 @@ static int azx_probe(struct pci_dev *pci,
>  	int err;
>  
>  	/* check if this driver can be used on SKL+ Intel platforms */
> -	if ((pci_id->driver_data & AZX_DCAPS_INTEL_SHARED) &&
> -	    pci->class != 0x040300)
> -		return -ENODEV;
> +	if (pci_id->driver_data & AZX_DCAPS_INTEL_SHARED) {
> +		switch (skl_pci_binding) {
> +		case SND_SKL_PCI_BIND_AUTO:
> +			if (pci->class != 0x040300) {
> +				dev_warn(&pci->dev, "The DSP is enabled on this platform, aborting probe\n");

I'd use dev_info() for these messages.
Loading this module is done by udev, not user, so it's no user's fault.

The reason I care about the printk level is that this message would
appear on the boot screen even if you set "quiet" kernel option
(although the quiet level became adjustable recently).

> +				return -ENODEV;
> +			}
> +			break;
> +		case SND_SKL_PCI_BIND_LEGACY:
> +			dev_warn(&pci->dev, "Module parameter forced binding with HDaudio legacy, bypassed detection logic\n");

Ditto.  This is information-only.

> +			break;
> +		case SND_SKL_PCI_BIND_ASOC:
> +			dev_err(&pci->dev, "Module parameter forced binding with SKL+ ASoC driver, aborting probe\n");
> +			return -ENODEV;

Ditto.

> +		default:
> +			dev_err(&pci->dev, "invalid value for skl_pci_binding module parameter, ignored\n");
> +			break;

This should be kept as error.

The similar logic applied to asoc driver.

In general, the dev_err() and dev_warn() should be used for the things
the user really has to care explicitly.


thanks,

Takashi


More information about the Alsa-devel mailing list