[alsa-devel] [PATCH v2] ALSA: hda: add Intel DSP configuration / probe code

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Wed Oct 2 19:06:39 CEST 2019


> +module_param(dsp_driver, int, 0444);
> +MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=noDSP, 2=legacy, 3=SST, 4=SOF)");

remove noDSP?

> +
> +static const u16 sof_skl_table[] = {
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
> +	0x02c8,	/* Cometlake-LP */
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
> +	0x06c8,	/* Cometlake-H */
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
> +	0x3198,	/* Geminilake */
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
> +	0x9dc8, /* Cannonlake */
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
> +	0xa348, /* Coffelake */
> +#endif

I am lost here, is this to handle the cases between legacy and SOF? If 
yes, we need to add all PCI IDs after gemini lake.

> +};
> +
> +static int snd_intel_dsp_check_device(u16 device, const u16 *table, u32 len)
> +{
> +	for (; len > 0; len--, table++) {
> +		if (*table == device)
> +			return 1;
> +	}
> +	return 0;
> +}
> +
> +static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
> +{
> +	struct nhlt_acpi_table *nhlt;
> +	int ret = 0;
> +
> +	if (snd_intel_dsp_check_device(pci->device, sof_skl_table, ARRAY_SIZE(sof_skl_table))) {
> +		nhlt = intel_nhlt_init(&pci->dev);
> +		if (nhlt) {
> +			if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt))
> +				ret = 1;
> +			intel_nhlt_free(nhlt);
> +		}
> +	}
> +	return ret;
> +}
> +
> +int snd_intel_dsp_driver_probe(struct pci_dev *pci)
> +{
> +	if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
> +		return dsp_driver;
> +
> +	/* Intel vendor only */
> +	if (snd_BUG_ON(pci->vendor != 0x8086))
> +		return SND_INTEL_DSP_DRIVER_ANY;
> +
> +	/*
> +	 * detect DSP by checking class/subclass/prog-id information
> +	 * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
> +	 * class=04 subclass 01 prog-if 00: DSP is present
> +	 *  (and may be required e.g. for DMIC or SSP support)
> +	 * class=04 subclass 03 prog-if 80: use DSP or legacy mode
> +	 */
> +	if (pci->class == 0x040300)
> +		return SND_INTEL_DSP_DRIVER_LEGACY;
> +	if (pci->class != 0x040100 && pci->class != 0x040380) {
> +		dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDA legacy driver\n", pci->class);
> +		return SND_INTEL_DSP_DRIVER_LEGACY;
> +	}
> +
> +	dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
> +
> +	/* Prefer SST driver for Broxton-P (Appololake) */
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL) || IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
> +	if (pci->device == 0x5a98)
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
> +		return SND_INTEL_DSP_DRIVER_SST;
> +#else
> +		return SND_INTEL_DSP_DRIVER_SOF;
> +#endif
> +#endif

This should be done with quirks, where we select SST for Chromebooks for 
APL, SKL, KBL.

Using the PCI ID + class only will break at least one device, I remotely 
debugged Hans de Goede's APL platform and saw the same issues with HDMI 
probe as on Linus' laptop.

I am running out of time for this week, so will check updates next week.

> +
> +	/* DMIC check for Skylake+ */
> +	if (snd_intel_dsp_check_dmic(pci)) {
> +		dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
> +		return SND_INTEL_DSP_DRIVER_SOF;
> +	}
> +
> +	return SND_INTEL_DSP_DRIVER_ANY;
> +}
> +


More information about the Alsa-devel mailing list