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

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Thu Oct 24 22:33:15 CEST 2019



On 10/22/19 12:43 PM, Jaroslav Kysela wrote:
> For distributions, we need one place where we can decide
> which driver will be activated for the auto-configation of the
> Intel's HDA hardware with DSP. Actually, we cover three drivers:
> 
> * Legacy HDA
> * Intel SST
> * Intel Sound Open Firmware (SOF)
> 
> All those drivers registers similar PCI IDs, so the first
> driver probed from the PCI stack can win. But... it is not
> guaranteed that the correct driver wins.
> 
> This commit changes Intel's NHLT ACPI module to a common
> DSP probe module for the Intel's hardware. All above sound
> drivers calls this code. The user can force another behaviour
> using the module parameter 'dsp_driver' located in
> the 'snd-intel-dspcfg' module.
> 
> This change allows to add specific dmi checks for the specific
> systems. The examples are taken from the pull request:
> 
>    https://github.com/thesofproject/linux/pull/927
> 
> Tested on Lenovo Carbon X1 7th gen.

Jaroslav, I found a case where the logic doesn't seem to work as intended.

the code currently scans through the table looking for a PCI ID match, 
and a DMI match for quirks.

On a KBL NUC device with the DSP enabled, we go through the entire list 
without finding a match, which means we return the _ANY flag. so if we 
try to probe the snd-soc-skl driver, the checks will allow the driver to 
continue, despite this configuration not being supported.

It was my understanding that we would always load the legacy driver 
*unless* there is a match in the table? If yes, there we can change the 
default this way:

@@ -333,7 +355,7 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
         /* find the configuration for the specific device */
         cfg = snd_intel_dsp_find_config(pci, config_table, 
ARRAY_SIZE(config_table));
         if (!cfg)
-               return SND_INTEL_DSP_DRIVER_ANY;
+               return SND_INTEL_DSP_DRIVER_LEGACY;

Or we need to add a case where we force the legacy in the table for each 
platform.



trace for KBL:
[   36.531664] snd_soc_skl 0000:00:1f.3: DSP detected with PCI 
class/subclass/prog-if info 0x040100
[   36.531664] plb: table 119a device 9d71
[   36.531666] plb: table 1a98 device 9d71
[   36.531666] plb: table 5a98 device 9d71
[   36.531667] plb: table 5a98 device 9d71
[   36.531667] plb: table 9d70 device 9d71
[   36.531668] plb: table 9d71 device 9d71
[   36.531668] plb: dmi table found
<< google chromebook quirk not applied
[   36.531669] plb: table 3198 device 9d71
[   36.531669] plb: table 9dc8 device 9d71
[   36.531670] plb: table 9dc8 device 9d71
[   36.531670] plb: table a348 device 9d71
[   36.531671] plb: table a348 device 9d71
[   36.531671] plb: table 2c8 device 9d71
[   36.531672] plb: table 2c8 device 9d71
[   36.531672] plb: table 6c8 device 9d71
[   36.531672] plb: table 34c8 device 9d71
[   36.531673] plb: table 34c8 device 9d71
[   36.531673] plb: table a0c8 device 9d71
[   36.531674] plb: table a0c8 device 9d71
[   36.531674] plb: table 4b55 device 9d71
<<< no config detected, so we return _ANY
[   36.535791] snd_soc_skl 0000:00:1f.3: codec_mask = 0x5

> 
> Signed-off-by: Jaroslav Kysela <perex at perex.cz>
> Tested-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> ---
>   include/sound/intel-dsp-config.h |  34 +++++
>   sound/hda/Kconfig                |  10 +-
>   sound/hda/Makefile               |   5 +-
>   sound/hda/intel-dsp-config.c     | 249 +++++++++++++++++++++++++++++++
>   sound/hda/intel-nhlt.c           |   3 -
>   sound/pci/hda/Kconfig            |  11 +-
>   sound/pci/hda/hda_intel.c        |  49 ++----
>   sound/soc/intel/Kconfig          |   2 +-
>   sound/soc/intel/skylake/skl.c    |  19 +--
>   sound/soc/sof/intel/Kconfig      |   2 +-
>   sound/soc/sof/sof-pci-dev.c      |   6 +
>   11 files changed, 322 insertions(+), 68 deletions(-)
>   create mode 100644 include/sound/intel-dsp-config.h
>   create mode 100644 sound/hda/intel-dsp-config.c
> 
> diff --git a/include/sound/intel-dsp-config.h b/include/sound/intel-dsp-config.h
> new file mode 100644
> index 000000000000..c36622bee3f8
> --- /dev/null
> +++ b/include/sound/intel-dsp-config.h
> @@ -0,0 +1,34 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + *  intel-dsp-config.h - Intel DSP config
> + *
> + *  Copyright (c) 2019 Jaroslav Kysela <perex at perex.cz>
> + */
> +
> +#ifndef __INTEL_DSP_CONFIG_H__
> +#define __INTEL_DSP_CONFIG_H__
> +
> +struct pci_dev;
> +
> +enum {
> +	SND_INTEL_DSP_DRIVER_ANY = 0,
> +	SND_INTEL_DSP_DRIVER_LEGACY,
> +	SND_INTEL_DSP_DRIVER_SST,
> +	SND_INTEL_DSP_DRIVER_SOF,
> +	SND_INTEL_DSP_DRIVER_LAST = SND_INTEL_DSP_DRIVER_SOF
> +};
> +
> +#if IS_ENABLED(CONFIG_SND_INTEL_DSP_CONFIG)
> +
> +int snd_intel_dsp_driver_probe(struct pci_dev *pci);
> +
> +#else
> +
> +static inline int snd_intel_dsp_driver_probe(struct pci_dev *pci)
> +{
> +	return SND_INTEL_DSP_DRIVER_ANY;
> +}
> +
> +#endif
> +
> +#endif
> diff --git a/sound/hda/Kconfig b/sound/hda/Kconfig
> index 3d33fc1757ba..b0c88fe040ee 100644
> --- a/sound/hda/Kconfig
> +++ b/sound/hda/Kconfig
> @@ -34,6 +34,12 @@ config SND_HDA_PREALLOC_SIZE
>   	  via a proc file (/proc/asound/card*/pcm*/sub*/prealloc), too.
>   
>   config SND_INTEL_NHLT
> -	tristate
> +	bool
>   	# this config should be selected only for Intel ACPI platforms.
> -	# A fallback is provided so that the code compiles in all cases.
> \ No newline at end of file
> +	# A fallback is provided so that the code compiles in all cases.
> +
> +config SND_INTEL_DSP_CONFIG
> +	tristate
> +	select SND_INTEL_NHLT if ACPI
> +	# this config should be selected only for Intel DSP platforms.
> +	# A fallback is provided so that the code compiles in all cases.
> diff --git a/sound/hda/Makefile b/sound/hda/Makefile
> index 8560f6ef1b19..601e617918b8 100644
> --- a/sound/hda/Makefile
> +++ b/sound/hda/Makefile
> @@ -14,5 +14,6 @@ obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o
>   #extended hda
>   obj-$(CONFIG_SND_HDA_EXT_CORE) += ext/
>   
> -snd-intel-nhlt-objs := intel-nhlt.o
> -obj-$(CONFIG_SND_INTEL_NHLT) += snd-intel-nhlt.o
> +snd-intel-dspcfg-objs := intel-dsp-config.o
> +snd-intel-dspcfg-$(CONFIG_SND_INTEL_NHLT) += intel-nhlt.o
> +obj-$(CONFIG_SND_INTEL_DSP_CONFIG) += snd-intel-dspcfg.o
> diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
> new file mode 100644
> index 000000000000..d9f6d9e872b4
> --- /dev/null
> +++ b/sound/hda/intel-dsp-config.c
> @@ -0,0 +1,249 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// Copyright (c) 2019 Jaroslav Kysela <perex at perex.cz>
> +
> +#include <linux/bits.h>
> +#include <linux/dmi.h>
> +#include <linux/module.h>
> +#include <linux/pci.h>
> +#include <sound/core.h>
> +#include <sound/intel-dsp-config.h>
> +#include <sound/intel-nhlt.h>
> +
> +static int dsp_driver;
> +
> +module_param(dsp_driver, int, 0444);
> +MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)");
> +
> +#define FLAG_SST		BIT(0)
> +#define FLAG_SOF		BIT(1)
> +#define FLAG_SOF_ONLY_IF_DMIC	BIT(16)
> +
> +struct config_entry {
> +	u32 flags;
> +	u16 device;
> +	const struct dmi_system_id *dmi_table;
> +};
> +
> +/*
> + * configuration table
> + * - the order of similar PCI ID entries is important!
> + * - the first successful match will win
> + */
> +static const struct config_entry config_table[] = {
> +/* Cometlake-LP */
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_LP)
> +	{
> +		/* prefer SST */
> +		.flags = FLAG_SST,
> +		.device = 0x02c8,
> +	},
> +#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
> +	{
> +		.flags = FLAG_SOF,
> +		.device = 0x02c8,
> +	},
> +#endif
> +/* Cometlake-H */
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_H)
> +	{
> +		.flags = FLAG_SST,
> +		.device = 0x06c8,
> +	},
> +#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
> +	{
> +		.flags = FLAG_SOF,
> +		.device = 0x06c8,
> +	},
> +#endif
> +/* Merrifield */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
> +	{
> +		.flags = FLAG_SOF,
> +		.device = 0x119a,
> +	},
> +#endif
> +/* Broxton-T */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x1a98,
> +	},
> +#endif
> +/* Geminilake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
> +	{
> +		.flags = FLAG_SOF,
> +		.device = 0x3198,
> +		.dmi_table = (const struct dmi_system_id []) {
> +			{
> +				.ident = "Google Chromebooks",
> +				.matches = {
> +					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
> +				}
> +			},
> +			{}
> +		}
> +	},
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_GLK)
> +	{
> +		.flags = FLAG_SST,
> +		.device = 0x3198,
> +	},
> +#endif
> +/* Icelake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x34c8,
> +	},
> +#endif
> +/* Elkhart Lake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x4b55,
> +	},
> +#endif
> +/* Appololake (Broxton-P) */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
> +	{
> +		.flags = FLAG_SOF,
> +		.device = 0x5a98,
> +		.dmi_table = (const struct dmi_system_id []) {
> +			{
> +				.ident = "Up Squared",
> +				.matches = {
> +					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
> +					DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"),
> +				}
> +			},
> +			{}
> +		}
> +	},
> +#endif
> +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
> +	{
> +		.flags = FLAG_SST,
> +		.device = 0x5a98,
> +	},
> +#endif
> +/* Cannonlake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x9dc8,
> +	},
> +#endif
> +/* Sunrise Point-LP */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_SKYLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x9d70,
> +	},
> +#endif
> +/* Kabylake-LP */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_KABYLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0x9d71,
> +	},
> +#endif
> +/* Tigerlake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0xa0c8,
> +	},
> +#endif
> +/* Coffelake */
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
> +	{
> +		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
> +		.device = 0xa348,
> +	},
> +#endif
> +};
> +
> +static const struct config_entry *snd_intel_dsp_find_config
> +		(struct pci_dev *pci, const struct config_entry *table, u32 len)
> +{
> +	u16 device;
> +
> +	device = pci->device;
> +	for (; len > 0; len--, table++) {
> +		if (table->device != device)
> +			continue;
> +		if (table->dmi_table && !dmi_check_system(table->dmi_table))
> +			continue;
> +		return table;
> +	}
> +	return NULL;
> +}
> +
> +static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
> +{
> +	struct nhlt_acpi_table *nhlt;
> +	int ret = 0;
> +
> +	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)
> +{
> +	const struct config_entry *cfg;
> +
> +	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);
> +
> +	/* find the configuration for the specific device */
> +	cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
> +	if (!cfg)
> +		return SND_INTEL_DSP_DRIVER_ANY;
> +
> +	if (cfg->flags & FLAG_SOF) {
> +		if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC) {
> +			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;
> +			}
> +		} else {
> +			return SND_INTEL_DSP_DRIVER_SOF;
> +		}
> +	}
> +
> +	if (cfg->flags & FLAG_SST)
> +		return SND_INTEL_DSP_DRIVER_SST;
> +
> +	return SND_INTEL_DSP_DRIVER_LEGACY;
> +}
> +EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Intel DSP config driver");
> diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c
> index daede96f28ee..097ff6c10099 100644
> --- a/sound/hda/intel-nhlt.c
> +++ b/sound/hda/intel-nhlt.c
> @@ -102,6 +102,3 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
>   	return dmic_geo;
>   }
>   EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
> -
> -MODULE_LICENSE("GPL v2");
> -MODULE_DESCRIPTION("Intel NHLT driver");
> diff --git a/sound/pci/hda/Kconfig b/sound/pci/hda/Kconfig
> index dae47a45b2b8..bd48335d09d7 100644
> --- a/sound/pci/hda/Kconfig
> +++ b/sound/pci/hda/Kconfig
> @@ -12,7 +12,7 @@ config SND_HDA_INTEL
>   	tristate "HD Audio PCI"
>   	depends on SND_PCI
>   	select SND_HDA
> -	select SND_INTEL_NHLT if ACPI
> +	select SND_INTEL_DSP_CONFIG
>   	help
>   	  Say Y here to include support for Intel "High Definition
>   	  Audio" (Azalia) and its compatible devices.
> @@ -23,15 +23,6 @@ config SND_HDA_INTEL
>   	  To compile this driver as a module, choose M here: the module
>   	  will be called snd-hda-intel.
>   
> -config SND_HDA_INTEL_DETECT_DMIC
> -	bool "DMIC detection and probe abort"
> -	depends on SND_HDA_INTEL
> -	help
> -	  Say Y to detect digital microphones on SKL+ devices. DMICs
> -	  cannot be handled by the HDaudio legacy driver and are
> -	  currently only supported by the SOF driver.
> -	  If unsure say N.
> -
>   config SND_HDA_TEGRA
>   	tristate "NVIDIA Tegra HD Audio"
>   	depends on ARCH_TEGRA
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 240f4ca76391..a916963822e0 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -46,7 +46,7 @@
>   #include <sound/initval.h>
>   #include <sound/hdaudio.h>
>   #include <sound/hda_i915.h>
> -#include <sound/intel-nhlt.h>
> +#include <sound/intel-dsp-config.h>
>   #include <linux/vgaarb.h>
>   #include <linux/vga_switcheroo.h>
>   #include <linux/firmware.h>
> @@ -124,7 +124,7 @@ static char *patch[SNDRV_CARDS];
>   static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
>   					CONFIG_SND_HDA_INPUT_BEEP_MODE};
>   #endif
> -static bool dmic_detect = IS_ENABLED(CONFIG_SND_HDA_INTEL_DETECT_DMIC);
> +static bool dsp_driver = 1;
>   
>   module_param_array(index, int, NULL, 0444);
>   MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
> @@ -159,8 +159,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
> -module_param(dmic_detect, bool, 0444);
> -MODULE_PARM_DESC(dmic_detect, "DMIC detect on SKL+ platforms");
> +module_param(dsp_driver, bool, 0444);
> +MODULE_PARM_DESC(dsp_driver, "Allow DSP driver selection (bypass this driver) "
> +			     "(0=off, 1=on) (default=1)");
>   
>   #ifdef CONFIG_PM
>   static int param_set_xint(const char *val, const struct kernel_param *kp);
> @@ -2020,25 +2021,6 @@ static const struct hda_controller_ops pci_hda_ops = {
>   	.position_check = azx_position_check,
>   };
>   
> -static int azx_check_dmic(struct pci_dev *pci, struct azx *chip)
> -{
> -	struct nhlt_acpi_table *nhlt;
> -	int ret = 0;
> -
> -	if (chip->driver_type == AZX_DRIVER_SKL &&
> -	    pci->class != 0x040300) {
> -		nhlt = intel_nhlt_init(&pci->dev);
> -		if (nhlt) {
> -			if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt)) {
> -				ret = -ENODEV;
> -				dev_info(&pci->dev, "Digital mics found on Skylake+ platform, aborting probe\n");
> -			}
> -			intel_nhlt_free(nhlt);
> -		}
> -	}
> -	return ret;
> -}
> -
>   static int azx_probe(struct pci_dev *pci,
>   		     const struct pci_device_id *pci_id)
>   {
> @@ -2056,6 +2038,16 @@ static int azx_probe(struct pci_dev *pci,
>   		return -ENOENT;
>   	}
>   
> +	/*
> +	 * stop probe if another Intel's DSP driver should be activated
> +	 */
> +	if (dsp_driver) {
> +		err = snd_intel_dsp_driver_probe(pci);
> +		if (err != SND_INTEL_DSP_DRIVER_ANY &&
> +		    err != SND_INTEL_DSP_DRIVER_LEGACY)
> +			return -ENODEV;
> +	}
> +
>   	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
>   			   0, &card);
>   	if (err < 0) {
> @@ -2069,17 +2061,6 @@ static int azx_probe(struct pci_dev *pci,
>   	card->private_data = chip;
>   	hda = container_of(chip, struct hda_intel, chip);
>   
> -	/*
> -	 * stop probe if digital microphones detected on Skylake+ platform
> -	 * with the DSP enabled. This is an opt-in behavior defined at build
> -	 * time or at run-time with a module parameter
> -	 */
> -	if (dmic_detect) {
> -		err = azx_check_dmic(pci, chip);
> -		if (err < 0)
> -			goto out_free;
> -	}
> -
>   	pci_set_drvdata(pci, card);
>   
>   	err = register_vga_switcheroo(chip);
> diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
> index 01c99750212a..9ad89d56092b 100644
> --- a/sound/soc/intel/Kconfig
> +++ b/sound/soc/intel/Kconfig
> @@ -215,7 +215,7 @@ config SND_SOC_INTEL_SKYLAKE_COMMON
>   	select SND_SOC_INTEL_SST
>   	select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC
>   	select SND_SOC_ACPI_INTEL_MATCH
> -	select SND_INTEL_NHLT if ACPI
> +	select SND_INTEL_DSP_CONFIG
>   	help
>   	  If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
>   	  GeminiLake or CannonLake platform with the DSP enabled in the BIOS
> diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c
> index 141dbbf975ac..58ba3e9469ba 100644
> --- a/sound/soc/intel/skylake/skl.c
> +++ b/sound/soc/intel/skylake/skl.c
> @@ -27,6 +27,7 @@
>   #include <sound/hda_i915.h>
>   #include <sound/hda_codec.h>
>   #include <sound/intel-nhlt.h>
> +#include <sound/intel-dsp-config.h>
>   #include "skl.h"
>   #include "skl-sst-dsp.h"
>   #include "skl-sst-ipc.h"
> @@ -987,22 +988,10 @@ static int skl_probe(struct pci_dev *pci,
>   
>   	switch (skl_pci_binding) {
>   	case SND_SKL_PCI_BIND_AUTO:
> -		/*
> -		 * 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) {
> -			dev_info(&pci->dev, "The DSP is not enabled on this platform, aborting probe\n");
> +		err = snd_intel_dsp_driver_probe(pci);
> +		if (err != SND_INTEL_DSP_DRIVER_ANY &&
> +		    err != SND_INTEL_DSP_DRIVER_SST)
>   			return -ENODEV;
> -		}
> -		if (pci->class != 0x040100 && pci->class != 0x040380) {
> -			dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class);
> -			return -ENODEV;
> -		}
> -		dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
>   		break;
>   	case SND_SKL_PCI_BIND_LEGACY:
>   		dev_info(&pci->dev, "Module parameter forced binding with HDaudio legacy, aborting probe\n");
> diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig
> index 479ba249e219..8a5d5c0f95f2 100644
> --- a/sound/soc/sof/intel/Kconfig
> +++ b/sound/soc/sof/intel/Kconfig
> @@ -286,7 +286,7 @@ config SND_SOC_SOF_HDA
>   	tristate
>   	select SND_HDA_EXT_CORE if SND_SOC_SOF_HDA_LINK
>   	select SND_SOC_HDAC_HDA if SND_SOC_SOF_HDA_AUDIO_CODEC
> -	select SND_INTEL_NHLT if ACPI
> +	select SND_INTEL_DSP_CONFIG
>   	help
>   	  This option is not user-selectable but automagically handled by
>   	  'select' statements at a higher level
> diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c
> index d66412a77873..3a9e0e2a150d 100644
> --- a/sound/soc/sof/sof-pci-dev.c
> +++ b/sound/soc/sof/sof-pci-dev.c
> @@ -12,6 +12,7 @@
>   #include <linux/module.h>
>   #include <linux/pci.h>
>   #include <linux/pm_runtime.h>
> +#include <sound/intel-dsp-config.h>
>   #include <sound/soc-acpi.h>
>   #include <sound/soc-acpi-intel-match.h>
>   #include <sound/sof.h>
> @@ -277,6 +278,11 @@ static int sof_pci_probe(struct pci_dev *pci,
>   	const struct snd_sof_dsp_ops *ops;
>   	int ret;
>   
> +	ret = snd_intel_dsp_driver_probe(pci);
> +	if (ret != SND_INTEL_DSP_DRIVER_ANY &&
> +	    ret != SND_INTEL_DSP_DRIVER_SOF)
> +		return -ENODEV;
> +
>   	dev_dbg(&pci->dev, "PCI DSP detected");
>   
>   	/* get ops for platform */
> 


More information about the Alsa-devel mailing list