Commit c337104b authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Takashi Iwai

ALSA: HD-Audio: SKL+: abort probe if DSP is present and Skylake driver selected

Now that the SST/Skylake driver supports per platform selectors, we
can add logic to automatically select the right driver.

If the Skylake driver is selected for a specific platform, and the DSP
is detected at run-time based on the PCI class/subclass/prog-if
information, the legacy HDaudio driver aborts the probe. This will
result in a single driver probing and remove the need for modprobe
blacklists.

Follow-up patches will add a module parameter to bypass the logic if
this automatic detection fails, or if the Skylake driver is unable to
actually support the platform (firmware authentication, missing
topology file, hardware issue, etc).

The same mechanism will be used to conflicts generated by the same PCI
ID being registered by both legacy HDAuudio and SOF drivers for Intel
platforms. In other words SOF will not require changes to the HDaudio
legacy.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 18d43c9b
...@@ -226,6 +226,68 @@ config SND_HDA_POWER_SAVE_DEFAULT ...@@ -226,6 +226,68 @@ config SND_HDA_POWER_SAVE_DEFAULT
The default time-out value in seconds for HD-audio automatic The default time-out value in seconds for HD-audio automatic
power-save mode. 0 means to disable the power-save mode. power-save mode. 0 means to disable the power-save mode.
if SND_HDA_INTEL
# The options below should not be enabled by distributions or
# users. They are selected by Intel/Skylake or SOF drivers when they
# register for a PCI ID which is also handled by the HDAudio legacy
# driver. When this option is selected and the DSP is detected based on
# the PCI class/subclass/prog-if, the probe of the HDAudio legacy
# aborts. This mechanism removes the need for distributions to use
# blacklists. It can be bypassed with module parameters should the
# Intel/Skylake or SOF drivers fail to handle a specific platform.
config SND_HDA_INTEL_DSP_DETECTION_SKL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
Skylake machines.
config SND_HDA_INTEL_DSP_DETECTION_APL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
Broxton/ApolloLake machines
config SND_HDA_INTEL_DSP_DETECTION_KBL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
KabyLake machines
config SND_HDA_INTEL_DSP_DETECTION_GLK
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
GeminiLake machines
config SND_HDA_INTEL_DSP_DETECTION_CNL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
CannonLake machines
config SND_HDA_INTEL_DSP_DETECTION_CFL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
CoffeeLake machines
config SND_HDA_INTEL_DSP_DETECTION_ICL
bool
help
This option is selected by SOF or SST drivers, not users or distros.
It enables DSP detection based on PCI class information for
IceLake machines
endif ## SND_HDA_INTEL
endif endif
endmenu endmenu
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#else #else
#define AZX_DCAPS_I915_COMPONENT 0 /* NOP */ #define AZX_DCAPS_I915_COMPONENT 0 /* NOP */
#endif #endif
/* 14 unused */ #define AZX_DCAPS_INTEL_SHARED (1 << 14) /* shared with ASoC */
#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ #define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ #define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
/* 17 unused */ /* 17 unused */
......
...@@ -357,6 +357,7 @@ enum { ...@@ -357,6 +357,7 @@ enum {
AZX_DCAPS_NO_64BIT |\ AZX_DCAPS_NO_64BIT |\
AZX_DCAPS_4K_BDLE_BOUNDARY | AZX_DCAPS_SNOOP_OFF) AZX_DCAPS_4K_BDLE_BOUNDARY | AZX_DCAPS_SNOOP_OFF)
#define AZX_DCAPS_INTEL_DSP_DETECTION(conf) (IS_ENABLED(CONFIG_SND_HDA_INTEL_DSP_DETECTION_##conf) ? AZX_DCAPS_INTEL_SHARED : 0)
/* /*
* vga_switcheroo support * vga_switcheroo support
*/ */
...@@ -2048,6 +2049,11 @@ static int azx_probe(struct pci_dev *pci, ...@@ -2048,6 +2049,11 @@ static int azx_probe(struct pci_dev *pci,
bool schedule_probe; bool schedule_probe;
int err; 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 (dev >= SNDRV_CARDS) if (dev >= SNDRV_CARDS)
return -ENODEV; return -ENODEV;
if (!enable[dev]) { if (!enable[dev]) {
...@@ -2354,34 +2360,48 @@ static const struct pci_device_id azx_ids[] = { ...@@ -2354,34 +2360,48 @@ static const struct pci_device_id azx_ids[] = {
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
/* Sunrise Point-LP */ /* Sunrise Point-LP */
{ PCI_DEVICE(0x8086, 0x9d70), { PCI_DEVICE(0x8086, 0x9d70),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
AZX_DCAPS_INTEL_DSP_DETECTION(SKL)
},
/* Kabylake */ /* Kabylake */
{ PCI_DEVICE(0x8086, 0xa171), { PCI_DEVICE(0x8086, 0xa171),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
/* Kabylake-LP */ /* Kabylake-LP */
{ PCI_DEVICE(0x8086, 0x9d71), { PCI_DEVICE(0x8086, 0x9d71),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
AZX_DCAPS_INTEL_DSP_DETECTION(KBL)
},
/* Kabylake-H */ /* Kabylake-H */
{ PCI_DEVICE(0x8086, 0xa2f0), { PCI_DEVICE(0x8086, 0xa2f0),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
/* Coffelake */ /* Coffelake */
{ PCI_DEVICE(0x8086, 0xa348), { PCI_DEVICE(0x8086, 0xa348),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
AZX_DCAPS_INTEL_DSP_DETECTION(CFL)
},
/* Cannonlake */ /* Cannonlake */
{ PCI_DEVICE(0x8086, 0x9dc8), { PCI_DEVICE(0x8086, 0x9dc8),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
AZX_DCAPS_INTEL_DSP_DETECTION(CNL)
},
/* Icelake */ /* Icelake */
{ PCI_DEVICE(0x8086, 0x34c8), { PCI_DEVICE(0x8086, 0x34c8),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
AZX_DCAPS_INTEL_DSP_DETECTION(ICL)
},
/* Broxton-P(Apollolake) */ /* Broxton-P(Apollolake) */
{ PCI_DEVICE(0x8086, 0x5a98), { PCI_DEVICE(0x8086, 0x5a98),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON |
AZX_DCAPS_INTEL_DSP_DETECTION(APL)
},
/* Broxton-T */ /* Broxton-T */
{ PCI_DEVICE(0x8086, 0x1a98), { PCI_DEVICE(0x8086, 0x1a98),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
/* Gemini-Lake */ /* Gemini-Lake */
{ PCI_DEVICE(0x8086, 0x3198), { PCI_DEVICE(0x8086, 0x3198),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON }, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON |
AZX_DCAPS_INTEL_DSP_DETECTION(GLK)
},
/* Haswell */ /* Haswell */
{ PCI_DEVICE(0x8086, 0x0a0c), { PCI_DEVICE(0x8086, 0x0a0c),
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
......
...@@ -188,6 +188,12 @@ config SND_SOC_INTEL_SKYLAKE_COMMON ...@@ -188,6 +188,12 @@ config SND_SOC_INTEL_SKYLAKE_COMMON
select SND_SOC_TOPOLOGY select SND_SOC_TOPOLOGY
select SND_SOC_INTEL_SST select SND_SOC_INTEL_SST
select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC
select SND_HDA_INTEL_DSP_DETECTION_SKL if SND_SOC_INTEL_SKL
select SND_HDA_INTEL_DSP_DETECTION_APL if SND_SOC_INTEL_APL
select SND_HDA_INTEL_DSP_DETECTION_KBL if SND_SOC_INTEL_KBL
select SND_HDA_INTEL_DSP_DETECTION_GLK if SND_SOC_INTEL_GLK
select SND_HDA_INTEL_DSP_DETECTION_CNL if SND_SOC_INTEL_CNL
select SND_HDA_INTEL_DSP_DETECTION_CFL if SND_SOC_INTEL_CFL
select SND_SOC_ACPI_INTEL_MATCH select SND_SOC_ACPI_INTEL_MATCH
help help
If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment