diff options
author | Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | 2018-12-07 17:50:04 -0600 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-12-13 15:35:33 +0000 |
commit | c746de8dbc7b0ae9df491f7a99a6dab34203b51b (patch) | |
tree | 15234fbcfa179084cf2b3065cdd4e1c1c3bcb4b5 /sound | |
parent | e6b98db945124987b1ecec3f5f030877627e01a9 (diff) | |
download | linux-c746de8dbc7b0ae9df491f7a99a6dab34203b51b.tar.gz linux-c746de8dbc7b0ae9df491f7a99a6dab34203b51b.tar.bz2 linux-c746de8dbc7b0ae9df491f7a99a6dab34203b51b.zip |
ASoC: Intel: Skylake: Harden DSP detection with PCI class/subclass info
The existing PPCAP and GCAP fields cannot be used reliably to
determine if the DSP is enabled by the BIOS. Instead rely on the
class/subclass information to find out if this driver can run or
not. The values in the code don't seem to be documented in publicly
available documents but are part of recommendations made to BIOS
writers and have been verified to be accurate on a number of
platforms.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/intel/skylake/skl.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c index df36b8fe6d5e..41a084b3d48f 100644 --- a/sound/soc/intel/skylake/skl.c +++ b/sound/soc/intel/skylake/skl.c @@ -916,6 +916,21 @@ static int skl_first_init(struct hdac_bus *bus) unsigned short gcap; int cp_streams, pb_streams, start_idx; + /* + * detect DSP by checking class/subclass/prog-id information + * class=04 subclass 03 prog-if 00: no DSP, legacy driver needs to be used + * 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: either of DSP or legacy mode can be used + */ + if (pci->class == 0x040300) { + dev_err(bus->dev, "The DSP is not enabled on this platform, aborting probe\n"); + return -ENODEV; + } else if (pci->class != 0x040100 && pci->class != 0x040380) { + dev_err(bus->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class); + return -ENODEV; + } + dev_info(bus->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); + err = pci_request_regions(pci, "Skylake HD audio"); if (err < 0) return err; |