xref: /openbmc/linux/sound/hda/intel-dsp-config.c (revision 905240d1)
182d9d54aSJaroslav Kysela // SPDX-License-Identifier: GPL-2.0
282d9d54aSJaroslav Kysela // Copyright (c) 2019 Jaroslav Kysela <perex@perex.cz>
382d9d54aSJaroslav Kysela 
406508575SPierre-Louis Bossart #include <linux/acpi.h>
582d9d54aSJaroslav Kysela #include <linux/bits.h>
682d9d54aSJaroslav Kysela #include <linux/dmi.h>
782d9d54aSJaroslav Kysela #include <linux/module.h>
882d9d54aSJaroslav Kysela #include <linux/pci.h>
906508575SPierre-Louis Bossart #include <linux/soundwire/sdw.h>
1006508575SPierre-Louis Bossart #include <linux/soundwire/sdw_intel.h>
1182d9d54aSJaroslav Kysela #include <sound/core.h>
1282d9d54aSJaroslav Kysela #include <sound/intel-dsp-config.h>
1382d9d54aSJaroslav Kysela #include <sound/intel-nhlt.h>
14de24d97fSPierre-Louis Bossart #include <sound/soc-acpi.h>
1582d9d54aSJaroslav Kysela 
1682d9d54aSJaroslav Kysela static int dsp_driver;
1782d9d54aSJaroslav Kysela 
1882d9d54aSJaroslav Kysela module_param(dsp_driver, int, 0444);
1982d9d54aSJaroslav Kysela MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)");
2082d9d54aSJaroslav Kysela 
2182d9d54aSJaroslav Kysela #define FLAG_SST			BIT(0)
2282d9d54aSJaroslav Kysela #define FLAG_SOF			BIT(1)
23df1fceacSCezary Rojewski #define FLAG_SST_ONLY_IF_DMIC		BIT(15)
2482d9d54aSJaroslav Kysela #define FLAG_SOF_ONLY_IF_DMIC		BIT(16)
2506508575SPierre-Louis Bossart #define FLAG_SOF_ONLY_IF_SOUNDWIRE	BIT(17)
2606508575SPierre-Louis Bossart 
2706508575SPierre-Louis Bossart #define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
2806508575SPierre-Louis Bossart 					    FLAG_SOF_ONLY_IF_SOUNDWIRE)
2982d9d54aSJaroslav Kysela 
3082d9d54aSJaroslav Kysela struct config_entry {
3182d9d54aSJaroslav Kysela 	u32 flags;
3282d9d54aSJaroslav Kysela 	u16 device;
33b5682305SPierre-Louis Bossart 	u8 acpi_hid[ACPI_ID_LEN];
3482d9d54aSJaroslav Kysela 	const struct dmi_system_id *dmi_table;
35de24d97fSPierre-Louis Bossart 	const struct snd_soc_acpi_codecs *codec_hid;
36de24d97fSPierre-Louis Bossart };
37de24d97fSPierre-Louis Bossart 
38de24d97fSPierre-Louis Bossart static const struct snd_soc_acpi_codecs __maybe_unused essx_83x6 = {
39de24d97fSPierre-Louis Bossart 	.num_codecs = 3,
40de24d97fSPierre-Louis Bossart 	.codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
4182d9d54aSJaroslav Kysela };
4282d9d54aSJaroslav Kysela 
4382d9d54aSJaroslav Kysela /*
4482d9d54aSJaroslav Kysela  * configuration table
4582d9d54aSJaroslav Kysela  * - the order of similar PCI ID entries is important!
4682d9d54aSJaroslav Kysela  * - the first successful match will win
4782d9d54aSJaroslav Kysela  */
4882d9d54aSJaroslav Kysela static const struct config_entry config_table[] = {
4982d9d54aSJaroslav Kysela /* Merrifield */
5082d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
5182d9d54aSJaroslav Kysela 	{
5282d9d54aSJaroslav Kysela 		.flags = FLAG_SOF,
530cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_SST_TNG,
5482d9d54aSJaroslav Kysela 	},
5582d9d54aSJaroslav Kysela #endif
56cc8f81c7SPierre-Louis Bossart /*
57cc8f81c7SPierre-Louis Bossart  * Apollolake (Broxton-P)
58b79de57bSPierre-Louis Bossart  * the legacy HDAudio driver is used except on Up Squared (SOF) and
599d36ceabSPierre-Louis Bossart  * Chromebooks (SST), as well as devices based on the ES8336 codec
60cc8f81c7SPierre-Louis Bossart  */
6182d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
6282d9d54aSJaroslav Kysela 	{
6382d9d54aSJaroslav Kysela 		.flags = FLAG_SOF,
640cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_APL,
6582d9d54aSJaroslav Kysela 		.dmi_table = (const struct dmi_system_id []) {
6682d9d54aSJaroslav Kysela 			{
6782d9d54aSJaroslav Kysela 				.ident = "Up Squared",
6882d9d54aSJaroslav Kysela 				.matches = {
6982d9d54aSJaroslav Kysela 					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
7082d9d54aSJaroslav Kysela 					DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"),
7182d9d54aSJaroslav Kysela 				}
7282d9d54aSJaroslav Kysela 			},
7382d9d54aSJaroslav Kysela 			{}
7482d9d54aSJaroslav Kysela 		}
7582d9d54aSJaroslav Kysela 	},
769d36ceabSPierre-Louis Bossart 	{
779d36ceabSPierre-Louis Bossart 		.flags = FLAG_SOF,
780cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_APL,
79de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
809d36ceabSPierre-Louis Bossart 	},
8182d9d54aSJaroslav Kysela #endif
8282d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
8382d9d54aSJaroslav Kysela 	{
8482d9d54aSJaroslav Kysela 		.flags = FLAG_SST,
850cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_APL,
86cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
87cc8f81c7SPierre-Louis Bossart 			{
88cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
89cc8f81c7SPierre-Louis Bossart 				.matches = {
90cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
91cc8f81c7SPierre-Louis Bossart 				}
92cc8f81c7SPierre-Louis Bossart 			},
93cc8f81c7SPierre-Louis Bossart 			{}
94cc8f81c7SPierre-Louis Bossart 		}
9582d9d54aSJaroslav Kysela 	},
9682d9d54aSJaroslav Kysela #endif
97cc8f81c7SPierre-Louis Bossart /*
98b79de57bSPierre-Louis Bossart  * Skylake and Kabylake use legacy HDAudio driver except for Google
99cc8f81c7SPierre-Louis Bossart  * Chromebooks (SST)
100cc8f81c7SPierre-Louis Bossart  */
101cc8f81c7SPierre-Louis Bossart 
102cc8f81c7SPierre-Louis Bossart /* Sunrise Point-LP */
103cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL)
104cc8f81c7SPierre-Louis Bossart 	{
105cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SST,
1060cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
107cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
108cc8f81c7SPierre-Louis Bossart 			{
109cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
110cc8f81c7SPierre-Louis Bossart 				.matches = {
111cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
112cc8f81c7SPierre-Louis Bossart 				}
113cc8f81c7SPierre-Louis Bossart 			},
114cc8f81c7SPierre-Louis Bossart 			{}
115cc8f81c7SPierre-Louis Bossart 		}
116cc8f81c7SPierre-Louis Bossart 	},
117df1fceacSCezary Rojewski 	{
118df1fceacSCezary Rojewski 		.flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
1190cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
120df1fceacSCezary Rojewski 	},
121cc8f81c7SPierre-Louis Bossart #endif
122cc8f81c7SPierre-Louis Bossart /* Kabylake-LP */
123cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL)
124cc8f81c7SPierre-Louis Bossart 	{
125cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SST,
1260cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
127cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
128cc8f81c7SPierre-Louis Bossart 			{
129cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
130cc8f81c7SPierre-Louis Bossart 				.matches = {
131cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
132cc8f81c7SPierre-Louis Bossart 				}
133cc8f81c7SPierre-Louis Bossart 			},
134cc8f81c7SPierre-Louis Bossart 			{}
135cc8f81c7SPierre-Louis Bossart 		}
136cc8f81c7SPierre-Louis Bossart 	},
137df1fceacSCezary Rojewski 	{
138df1fceacSCezary Rojewski 		.flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
1390cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
140df1fceacSCezary Rojewski 	},
141cc8f81c7SPierre-Louis Bossart #endif
142cc8f81c7SPierre-Louis Bossart 
143cc8f81c7SPierre-Louis Bossart /*
144b79de57bSPierre-Louis Bossart  * Geminilake uses legacy HDAudio driver except for Google
1459d36ceabSPierre-Louis Bossart  * Chromebooks and devices based on the ES8336 codec
146cc8f81c7SPierre-Louis Bossart  */
147cc8f81c7SPierre-Louis Bossart /* Geminilake */
148cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
149cc8f81c7SPierre-Louis Bossart 	{
150cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
1510cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_GML,
152cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
153cc8f81c7SPierre-Louis Bossart 			{
154cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
155cc8f81c7SPierre-Louis Bossart 				.matches = {
156cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
157cc8f81c7SPierre-Louis Bossart 				}
158cc8f81c7SPierre-Louis Bossart 			},
159cc8f81c7SPierre-Louis Bossart 			{}
160cc8f81c7SPierre-Louis Bossart 		}
161cc8f81c7SPierre-Louis Bossart 	},
1629d36ceabSPierre-Louis Bossart 	{
1639d36ceabSPierre-Louis Bossart 		.flags = FLAG_SOF,
1640cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_GML,
165de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
1669d36ceabSPierre-Louis Bossart 	},
167cc8f81c7SPierre-Louis Bossart #endif
168cc8f81c7SPierre-Louis Bossart 
169cc8f81c7SPierre-Louis Bossart /*
170*905240d1SBrady Norander  * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake, AlderLake,
171*905240d1SBrady Norander  * RaptorLake use legacy HDAudio driver except for Google Chromebooks
172*905240d1SBrady Norander  * and when DMICs are present. Two cases are required since Coreboot
173*905240d1SBrady Norander  * does not expose NHLT tables.
174cc8f81c7SPierre-Louis Bossart  *
175cc8f81c7SPierre-Louis Bossart  * When the Chromebook quirk is not present, it's based on information
176cc8f81c7SPierre-Louis Bossart  * that no such device exists. When the quirk is present, it could be
177cc8f81c7SPierre-Louis Bossart  * either based on product information or a placeholder.
178cc8f81c7SPierre-Louis Bossart  */
179cc8f81c7SPierre-Louis Bossart 
18082d9d54aSJaroslav Kysela /* Cannonlake */
18182d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
18282d9d54aSJaroslav Kysela 	{
183cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
1840cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
185cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
186cc8f81c7SPierre-Louis Bossart 			{
187cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
188cc8f81c7SPierre-Louis Bossart 				.matches = {
189cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
190cc8f81c7SPierre-Louis Bossart 				}
191cc8f81c7SPierre-Louis Bossart 			},
19233fa35dbSPierre-Louis Bossart 			{
19333fa35dbSPierre-Louis Bossart 				.ident = "UP-WHL",
19433fa35dbSPierre-Louis Bossart 				.matches = {
19533fa35dbSPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
19633fa35dbSPierre-Louis Bossart 				}
19733fa35dbSPierre-Louis Bossart 			},
198cc8f81c7SPierre-Louis Bossart 			{}
199cc8f81c7SPierre-Louis Bossart 		}
200cc8f81c7SPierre-Louis Bossart 	},
201cc8f81c7SPierre-Louis Bossart 	{
202cded07a2SPierre-Louis Bossart 		.flags = FLAG_SOF,
2030cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
204cded07a2SPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
205cded07a2SPierre-Louis Bossart 	},
206cded07a2SPierre-Louis Bossart 	{
20706508575SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2080cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
20982d9d54aSJaroslav Kysela 	},
21082d9d54aSJaroslav Kysela #endif
211cc8f81c7SPierre-Louis Bossart 
21282d9d54aSJaroslav Kysela /* Coffelake */
21382d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
21482d9d54aSJaroslav Kysela 	{
215cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
2160cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CNL_H,
217cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
218cc8f81c7SPierre-Louis Bossart 			{
219cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
220cc8f81c7SPierre-Louis Bossart 				.matches = {
221cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
222cc8f81c7SPierre-Louis Bossart 				}
223cc8f81c7SPierre-Louis Bossart 			},
224cc8f81c7SPierre-Louis Bossart 			{}
225cc8f81c7SPierre-Louis Bossart 		}
226cc8f81c7SPierre-Louis Bossart 	},
227cc8f81c7SPierre-Louis Bossart 	{
22806508575SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2290cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CNL_H,
23082d9d54aSJaroslav Kysela 	},
23182d9d54aSJaroslav Kysela #endif
232cc8f81c7SPierre-Louis Bossart 
2334228668eSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
234cc8f81c7SPierre-Louis Bossart /* Cometlake-LP */
235cc8f81c7SPierre-Louis Bossart 	{
236cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
2370cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
238cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
239cc8f81c7SPierre-Louis Bossart 			{
240cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
241cc8f81c7SPierre-Louis Bossart 				.matches = {
242cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
243cc8f81c7SPierre-Louis Bossart 				}
244cc8f81c7SPierre-Louis Bossart 			},
24506508575SPierre-Louis Bossart 			{
24606508575SPierre-Louis Bossart 				.matches = {
24706508575SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
24806508575SPierre-Louis Bossart 					DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "09C6")
24906508575SPierre-Louis Bossart 				},
25006508575SPierre-Louis Bossart 			},
25106508575SPierre-Louis Bossart 			{
25206508575SPierre-Louis Bossart 				/* early version of SKU 09C6 */
25306508575SPierre-Louis Bossart 				.matches = {
25406508575SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
25506508575SPierre-Louis Bossart 					DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0983")
25606508575SPierre-Louis Bossart 				},
25706508575SPierre-Louis Bossart 			},
258cc8f81c7SPierre-Louis Bossart 			{}
259cc8f81c7SPierre-Louis Bossart 		}
260cc8f81c7SPierre-Louis Bossart 	},
261cc8f81c7SPierre-Louis Bossart 	{
262ae26c08eSPierre-Louis Bossart 		.flags = FLAG_SOF,
2630cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
264de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
265ae26c08eSPierre-Louis Bossart 	},
266081c7370SBrent Lu 	{
267081c7370SBrent Lu 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2680cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
269081c7370SBrent Lu 	},
270cc8f81c7SPierre-Louis Bossart /* Cometlake-H */
271cc8f81c7SPierre-Louis Bossart 	{
27206508575SPierre-Louis Bossart 		.flags = FLAG_SOF,
2730cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
27406508575SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
27506508575SPierre-Louis Bossart 			{
27606508575SPierre-Louis Bossart 				.matches = {
27706508575SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
27806508575SPierre-Louis Bossart 					DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "098F"),
27906508575SPierre-Louis Bossart 				},
28006508575SPierre-Louis Bossart 			},
28106508575SPierre-Louis Bossart 			{
28206508575SPierre-Louis Bossart 				.matches = {
28306508575SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
28406508575SPierre-Louis Bossart 					DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0990"),
28506508575SPierre-Louis Bossart 				},
28606508575SPierre-Louis Bossart 			},
28706508575SPierre-Louis Bossart 			{}
28806508575SPierre-Louis Bossart 		}
28906508575SPierre-Louis Bossart 	},
29006508575SPierre-Louis Bossart 	{
291ae26c08eSPierre-Louis Bossart 		.flags = FLAG_SOF,
2920cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
293de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
294ae26c08eSPierre-Louis Bossart 	},
295081c7370SBrent Lu 	{
296081c7370SBrent Lu 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2970cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
298081c7370SBrent Lu 	},
299cc8f81c7SPierre-Louis Bossart #endif
300cc8f81c7SPierre-Louis Bossart 
301cc8f81c7SPierre-Louis Bossart /* Icelake */
302cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
303cc8f81c7SPierre-Louis Bossart 	{
304cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
3050cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
306cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
307cc8f81c7SPierre-Louis Bossart 			{
308cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
309cc8f81c7SPierre-Louis Bossart 				.matches = {
310cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
311cc8f81c7SPierre-Louis Bossart 				}
312cc8f81c7SPierre-Louis Bossart 			},
313cc8f81c7SPierre-Louis Bossart 			{}
314cc8f81c7SPierre-Louis Bossart 		}
315cc8f81c7SPierre-Louis Bossart 	},
316cc8f81c7SPierre-Louis Bossart 	{
3175d73263fSPierre-Louis Bossart 		.flags = FLAG_SOF,
3180cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
3195d73263fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
3205d73263fSPierre-Louis Bossart 	},
3215d73263fSPierre-Louis Bossart 	{
32206508575SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3230cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
324cc8f81c7SPierre-Louis Bossart 	},
325cc8f81c7SPierre-Louis Bossart #endif
326cc8f81c7SPierre-Louis Bossart 
327fa9730b4SPierre-Louis Bossart /* Jasper Lake */
328fa9730b4SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
329fa9730b4SPierre-Louis Bossart 	{
330fa9730b4SPierre-Louis Bossart 		.flags = FLAG_SOF,
3310cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
33219980aa1SBrent Lu 		.dmi_table = (const struct dmi_system_id []) {
33319980aa1SBrent Lu 			{
33419980aa1SBrent Lu 				.ident = "Google Chromebooks",
33519980aa1SBrent Lu 				.matches = {
33619980aa1SBrent Lu 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
33719980aa1SBrent Lu 				}
33819980aa1SBrent Lu 			},
33919980aa1SBrent Lu 			{}
34019980aa1SBrent Lu 		}
34119980aa1SBrent Lu 	},
34219980aa1SBrent Lu 	{
34319980aa1SBrent Lu 		.flags = FLAG_SOF,
3440cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
345de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
346fa9730b4SPierre-Louis Bossart 	},
34719980aa1SBrent Lu 	{
34819980aa1SBrent Lu 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3490cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
35019980aa1SBrent Lu 	},
351fa9730b4SPierre-Louis Bossart #endif
352fa9730b4SPierre-Louis Bossart 
353cc8f81c7SPierre-Louis Bossart /* Tigerlake */
354cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
355cc8f81c7SPierre-Louis Bossart 	{
356cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
3570cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
358cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
359cc8f81c7SPierre-Louis Bossart 			{
360cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
361cc8f81c7SPierre-Louis Bossart 				.matches = {
362cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
363cc8f81c7SPierre-Louis Bossart 				}
364cc8f81c7SPierre-Louis Bossart 			},
36533fa35dbSPierre-Louis Bossart 			{
36633fa35dbSPierre-Louis Bossart 				.ident = "UPX-TGL",
36733fa35dbSPierre-Louis Bossart 				.matches = {
36833fa35dbSPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
36933fa35dbSPierre-Louis Bossart 				}
37033fa35dbSPierre-Louis Bossart 			},
371cc8f81c7SPierre-Louis Bossart 			{}
372cc8f81c7SPierre-Louis Bossart 		}
373cc8f81c7SPierre-Louis Bossart 	},
374cc8f81c7SPierre-Louis Bossart 	{
375081c7370SBrent Lu 		.flags = FLAG_SOF,
3760cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
377de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
378081c7370SBrent Lu 	},
379081c7370SBrent Lu 	{
38006508575SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3810cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
382cc8f81c7SPierre-Louis Bossart 	},
383c5b5ff60SBard Liao 	{
384c5b5ff60SBard Liao 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3850cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_H,
386c5b5ff60SBard Liao 	},
387cc8f81c7SPierre-Louis Bossart #endif
388cc8f81c7SPierre-Louis Bossart 
389cc8f81c7SPierre-Louis Bossart /* Elkhart Lake */
390cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
391cc8f81c7SPierre-Louis Bossart 	{
392cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3930cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_EHL_0,
394cc8f81c7SPierre-Louis Bossart 	},
395114613f6SPierre-Louis Bossart 	{
396114613f6SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3970cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_EHL_3,
398114613f6SPierre-Louis Bossart 	},
399cc8f81c7SPierre-Louis Bossart #endif
400cc8f81c7SPierre-Louis Bossart 
4010cd0a7c2SAmadeusz Sławiński /* Alder Lake / Raptor Lake */
402c4294d7fSKai Vehmanen #if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
403c4294d7fSKai Vehmanen 	{
404c4294d7fSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4050cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_S,
406c4294d7fSKai Vehmanen 	},
407d52eee98SPierre-Louis Bossart 	{
408d52eee98SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4090cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_S,
410d52eee98SPierre-Louis Bossart 	},
411c4294d7fSKai Vehmanen 	{
4122ec8b081SMuralidhar Reddy 		.flags = FLAG_SOF,
4130cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
414*905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
415*905240d1SBrady Norander 			{
416*905240d1SBrady Norander 				.ident = "Google Chromebooks",
417*905240d1SBrady Norander 				.matches = {
418*905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
419*905240d1SBrady Norander 				}
420*905240d1SBrady Norander 			},
421*905240d1SBrady Norander 			{}
422*905240d1SBrady Norander 		}
423*905240d1SBrady Norander 	},
424*905240d1SBrady Norander 	{
425*905240d1SBrady Norander 		.flags = FLAG_SOF,
426*905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
4272ec8b081SMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4282ec8b081SMuralidhar Reddy 	},
4292ec8b081SMuralidhar Reddy 	{
430c4294d7fSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4310cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
432c4294d7fSKai Vehmanen 	},
4334ad7935dSKai Vehmanen 	{
4344ad7935dSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4350cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX,
436ca1ece24SKai Vehmanen 	},
437d52eee98SPierre-Louis Bossart 	{
4389db1c9faSMuralidhar Reddy 		.flags = FLAG_SOF,
4390cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
4409db1c9faSMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4419db1c9faSMuralidhar Reddy 	},
4429db1c9faSMuralidhar Reddy 	{
443d52eee98SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4440cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
445b07908abSGongjun Song 	},
446b07908abSGongjun Song 	{
447b07908abSGongjun Song 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4480cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_M,
449b07908abSGongjun Song 	},
450c35fbea4SPierre-Louis Bossart 	{
451*905240d1SBrady Norander 		.flags = FLAG_SOF,
452*905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
453*905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
454*905240d1SBrady Norander 			{
455*905240d1SBrady Norander 				.ident = "Google Chromebooks",
456*905240d1SBrady Norander 				.matches = {
457*905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
458*905240d1SBrady Norander 				}
459*905240d1SBrady Norander 			},
460*905240d1SBrady Norander 			{}
461*905240d1SBrady Norander 		}
462*905240d1SBrady Norander 	},
463*905240d1SBrady Norander 	{
464c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4650cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
466c35fbea4SPierre-Louis Bossart 	},
467c35fbea4SPierre-Louis Bossart 	{
468*905240d1SBrady Norander 		.flags = FLAG_SOF,
469*905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
470*905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
471*905240d1SBrady Norander 			{
472*905240d1SBrady Norander 				.ident = "Google Chromebooks",
473*905240d1SBrady Norander 				.matches = {
474*905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
475*905240d1SBrady Norander 				}
476*905240d1SBrady Norander 			},
477*905240d1SBrady Norander 			{}
478*905240d1SBrady Norander 		}
479*905240d1SBrady Norander 	},
480*905240d1SBrady Norander 	{
481c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4820cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
4830cd0a7c2SAmadeusz Sławiński 	},
4840cd0a7c2SAmadeusz Sławiński 	{
485*905240d1SBrady Norander 		.flags = FLAG_SOF,
486*905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
487*905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
488*905240d1SBrady Norander 			{
489*905240d1SBrady Norander 				.ident = "Google Chromebooks",
490*905240d1SBrady Norander 				.matches = {
491*905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
492*905240d1SBrady Norander 				}
493*905240d1SBrady Norander 			},
494*905240d1SBrady Norander 			{}
495*905240d1SBrady Norander 		}
496*905240d1SBrady Norander 	},
497*905240d1SBrady Norander 	{
4980cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4990cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
5000cd0a7c2SAmadeusz Sławiński 	},
5010cd0a7c2SAmadeusz Sławiński 	{
5020cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5030cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_M,
5040cd0a7c2SAmadeusz Sławiński 	},
5050cd0a7c2SAmadeusz Sławiński 	{
5060cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5070cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX,
508c35fbea4SPierre-Louis Bossart 	},
509c4294d7fSKai Vehmanen #endif
510c4294d7fSKai Vehmanen 
511bbdf904bSBard Liao /* Meteor Lake */
512bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE)
513bbdf904bSBard Liao 	/* Meteorlake-P */
514bbdf904bSBard Liao 	{
515bbdf904bSBard Liao 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
51673e6ebf6SPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_MTL,
517bbdf904bSBard Liao 	},
518bbdf904bSBard Liao #endif
519bbdf904bSBard Liao 
520d2852b8cSPierre-Louis Bossart /* Lunar Lake */
521d2852b8cSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_LUNARLAKE)
522d2852b8cSPierre-Louis Bossart 	/* Lunarlake-P */
523d2852b8cSPierre-Louis Bossart 	{
524d2852b8cSPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
525d2852b8cSPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_LNL_P,
526d2852b8cSPierre-Louis Bossart 	},
527d2852b8cSPierre-Louis Bossart #endif
52882d9d54aSJaroslav Kysela };
52982d9d54aSJaroslav Kysela 
53082d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config
53182d9d54aSJaroslav Kysela 		(struct pci_dev *pci, const struct config_entry *table, u32 len)
53282d9d54aSJaroslav Kysela {
53382d9d54aSJaroslav Kysela 	u16 device;
53482d9d54aSJaroslav Kysela 
53582d9d54aSJaroslav Kysela 	device = pci->device;
53682d9d54aSJaroslav Kysela 	for (; len > 0; len--, table++) {
53782d9d54aSJaroslav Kysela 		if (table->device != device)
53882d9d54aSJaroslav Kysela 			continue;
53982d9d54aSJaroslav Kysela 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
54082d9d54aSJaroslav Kysela 			continue;
541de24d97fSPierre-Louis Bossart 		if (table->codec_hid) {
542de24d97fSPierre-Louis Bossart 			int i;
543de24d97fSPierre-Louis Bossart 
544de24d97fSPierre-Louis Bossart 			for (i = 0; i < table->codec_hid->num_codecs; i++)
545de24d97fSPierre-Louis Bossart 				if (acpi_dev_present(table->codec_hid->codecs[i], NULL, -1))
546de24d97fSPierre-Louis Bossart 					break;
547de24d97fSPierre-Louis Bossart 			if (i == table->codec_hid->num_codecs)
5489d36ceabSPierre-Louis Bossart 				continue;
549de24d97fSPierre-Louis Bossart 		}
55082d9d54aSJaroslav Kysela 		return table;
55182d9d54aSJaroslav Kysela 	}
55282d9d54aSJaroslav Kysela 	return NULL;
55382d9d54aSJaroslav Kysela }
55482d9d54aSJaroslav Kysela 
55582d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
55682d9d54aSJaroslav Kysela {
55782d9d54aSJaroslav Kysela 	struct nhlt_acpi_table *nhlt;
55882d9d54aSJaroslav Kysela 	int ret = 0;
55982d9d54aSJaroslav Kysela 
56082d9d54aSJaroslav Kysela 	nhlt = intel_nhlt_init(&pci->dev);
56182d9d54aSJaroslav Kysela 	if (nhlt) {
5628235a08bSAmadeusz Sławiński 		if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC))
56382d9d54aSJaroslav Kysela 			ret = 1;
56482d9d54aSJaroslav Kysela 		intel_nhlt_free(nhlt);
56582d9d54aSJaroslav Kysela 	}
56682d9d54aSJaroslav Kysela 	return ret;
56782d9d54aSJaroslav Kysela }
56882d9d54aSJaroslav Kysela 
56906508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
57006508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
57106508575SPierre-Louis Bossart {
57206508575SPierre-Louis Bossart 	struct sdw_intel_acpi_info info;
57306508575SPierre-Louis Bossart 	acpi_handle handle;
57406508575SPierre-Louis Bossart 	int ret;
57506508575SPierre-Louis Bossart 
57606508575SPierre-Louis Bossart 	handle = ACPI_HANDLE(&pci->dev);
57706508575SPierre-Louis Bossart 
57806508575SPierre-Louis Bossart 	ret = sdw_intel_acpi_scan(handle, &info);
57906508575SPierre-Louis Bossart 	if (ret < 0)
58006508575SPierre-Louis Bossart 		return ret;
58106508575SPierre-Louis Bossart 
58206508575SPierre-Louis Bossart 	return info.link_mask;
58306508575SPierre-Louis Bossart }
58406508575SPierre-Louis Bossart #else
58506508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
58606508575SPierre-Louis Bossart {
58706508575SPierre-Louis Bossart 	return 0;
58806508575SPierre-Louis Bossart }
58906508575SPierre-Louis Bossart #endif
59006508575SPierre-Louis Bossart 
59182d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci)
59282d9d54aSJaroslav Kysela {
59382d9d54aSJaroslav Kysela 	const struct config_entry *cfg;
59482d9d54aSJaroslav Kysela 
59591636a82STakashi Iwai 	/* Intel vendor only */
5960cd0a7c2SAmadeusz Sławiński 	if (pci->vendor != PCI_VENDOR_ID_INTEL)
59791636a82STakashi Iwai 		return SND_INTEL_DSP_DRIVER_ANY;
59891636a82STakashi Iwai 
5990e5cc221SPierre-Louis Bossart 	/*
6000e5cc221SPierre-Louis Bossart 	 * Legacy devices don't have a PCI-based DSP and use HDaudio
6010e5cc221SPierre-Louis Bossart 	 * for HDMI/DP support, ignore kernel parameter
6020e5cc221SPierre-Louis Bossart 	 */
6030e5cc221SPierre-Louis Bossart 	switch (pci->device) {
6040cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BDW:
6050cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_0:
6060cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_2:
6070cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_3:
6080cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BYT:
6090cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BSW:
6100e5cc221SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
6110e5cc221SPierre-Louis Bossart 	}
6120e5cc221SPierre-Louis Bossart 
61382d9d54aSJaroslav Kysela 	if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
61482d9d54aSJaroslav Kysela 		return dsp_driver;
61582d9d54aSJaroslav Kysela 
61682d9d54aSJaroslav Kysela 	/*
61782d9d54aSJaroslav Kysela 	 * detect DSP by checking class/subclass/prog-id information
61882d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
61982d9d54aSJaroslav Kysela 	 * class=04 subclass 01 prog-if 00: DSP is present
62082d9d54aSJaroslav Kysela 	 *  (and may be required e.g. for DMIC or SSP support)
62182d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 80: use DSP or legacy mode
62282d9d54aSJaroslav Kysela 	 */
62382d9d54aSJaroslav Kysela 	if (pci->class == 0x040300)
62482d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
62582d9d54aSJaroslav Kysela 	if (pci->class != 0x040100 && pci->class != 0x040380) {
626b79de57bSPierre-Louis Bossart 		dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class);
62782d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
62882d9d54aSJaroslav Kysela 	}
62982d9d54aSJaroslav Kysela 
63082d9d54aSJaroslav Kysela 	dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
63182d9d54aSJaroslav Kysela 
63282d9d54aSJaroslav Kysela 	/* find the configuration for the specific device */
63382d9d54aSJaroslav Kysela 	cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
63482d9d54aSJaroslav Kysela 	if (!cfg)
63582d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_ANY;
63682d9d54aSJaroslav Kysela 
63782d9d54aSJaroslav Kysela 	if (cfg->flags & FLAG_SOF) {
63806508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
63906508575SPierre-Louis Bossart 		    snd_intel_dsp_check_soundwire(pci) > 0) {
64006508575SPierre-Louis Bossart 			dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
64106508575SPierre-Louis Bossart 			return SND_INTEL_DSP_DRIVER_SOF;
64206508575SPierre-Louis Bossart 		}
64306508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
64406508575SPierre-Louis Bossart 		    snd_intel_dsp_check_dmic(pci)) {
64582d9d54aSJaroslav Kysela 			dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
64682d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
64782d9d54aSJaroslav Kysela 		}
64806508575SPierre-Louis Bossart 		if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
64982d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
65082d9d54aSJaroslav Kysela 	}
65182d9d54aSJaroslav Kysela 
652df1fceacSCezary Rojewski 
653df1fceacSCezary Rojewski 	if (cfg->flags & FLAG_SST) {
654df1fceacSCezary Rojewski 		if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) {
655df1fceacSCezary Rojewski 			if (snd_intel_dsp_check_dmic(pci)) {
656df1fceacSCezary Rojewski 				dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
65782d9d54aSJaroslav Kysela 				return SND_INTEL_DSP_DRIVER_SST;
658df1fceacSCezary Rojewski 			}
659df1fceacSCezary Rojewski 		} else {
660df1fceacSCezary Rojewski 			return SND_INTEL_DSP_DRIVER_SST;
661df1fceacSCezary Rojewski 		}
662df1fceacSCezary Rojewski 	}
66382d9d54aSJaroslav Kysela 
66482d9d54aSJaroslav Kysela 	return SND_INTEL_DSP_DRIVER_LEGACY;
66582d9d54aSJaroslav Kysela }
66682d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
66782d9d54aSJaroslav Kysela 
6685427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */
6695427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
6705427c7d6SHans de Goede     !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
6715427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SOF
6725427c7d6SHans de Goede #else
6735427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SST
6745427c7d6SHans de Goede #endif
6755427c7d6SHans de Goede 
676b5682305SPierre-Louis Bossart /*
677b5682305SPierre-Louis Bossart  * configuration table
678b5682305SPierre-Louis Bossart  * - the order of similar ACPI ID entries is important!
679b5682305SPierre-Louis Bossart  * - the first successful match will win
680b5682305SPierre-Louis Bossart  */
681b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = {
6825427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
6835427c7d6SHans de Goede     IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
684b5682305SPierre-Louis Bossart /* BayTrail */
685b5682305SPierre-Louis Bossart 	{
6865427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
687b5682305SPierre-Louis Bossart 		.acpi_hid = "80860F28",
688b5682305SPierre-Louis Bossart 	},
689b5682305SPierre-Louis Bossart /* CherryTrail */
690b5682305SPierre-Louis Bossart 	{
6915427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
692b5682305SPierre-Louis Bossart 		.acpi_hid = "808622A8",
693b5682305SPierre-Louis Bossart 	},
694b5682305SPierre-Louis Bossart #endif
695803e5913SPierre-Louis Bossart /* Broadwell */
696803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
697803e5913SPierre-Louis Bossart 	{
698803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
699803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
700803e5913SPierre-Louis Bossart 	},
701803e5913SPierre-Louis Bossart #endif
702803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL)
703803e5913SPierre-Louis Bossart 	{
704803e5913SPierre-Louis Bossart 		.flags = FLAG_SOF,
705803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
706803e5913SPierre-Louis Bossart 	},
707803e5913SPierre-Louis Bossart #endif
708803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */
709803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
710803e5913SPierre-Louis Bossart 	{
711803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
712803e5913SPierre-Louis Bossart 		.acpi_hid = "INT33C8"
713803e5913SPierre-Louis Bossart 	},
714803e5913SPierre-Louis Bossart #endif
715b5682305SPierre-Louis Bossart };
716b5682305SPierre-Louis Bossart 
717b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],
718b5682305SPierre-Louis Bossart 								 const struct config_entry *table,
719b5682305SPierre-Louis Bossart 								 u32 len)
720b5682305SPierre-Louis Bossart {
721b5682305SPierre-Louis Bossart 	for (; len > 0; len--, table++) {
722b5682305SPierre-Louis Bossart 		if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN))
723b5682305SPierre-Louis Bossart 			continue;
724b5682305SPierre-Louis Bossart 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
725b5682305SPierre-Louis Bossart 			continue;
726b5682305SPierre-Louis Bossart 		return table;
727b5682305SPierre-Louis Bossart 	}
728b5682305SPierre-Louis Bossart 	return NULL;
729b5682305SPierre-Louis Bossart }
730b5682305SPierre-Louis Bossart 
731b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN])
732b5682305SPierre-Louis Bossart {
733b5682305SPierre-Louis Bossart 	const struct config_entry *cfg;
734b5682305SPierre-Louis Bossart 
735b5682305SPierre-Louis Bossart 	if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
736b5682305SPierre-Louis Bossart 		return dsp_driver;
737b5682305SPierre-Louis Bossart 
738b5682305SPierre-Louis Bossart 	if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) {
739b5682305SPierre-Louis Bossart 		dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n",
740b5682305SPierre-Louis Bossart 			 SND_INTEL_DSP_DRIVER_LEGACY);
741b5682305SPierre-Louis Bossart 	}
742b5682305SPierre-Louis Bossart 
743b5682305SPierre-Louis Bossart 	/* find the configuration for the specific device */
744b5682305SPierre-Louis Bossart 	cfg = snd_intel_acpi_dsp_find_config(acpi_hid,  acpi_config_table,
745b5682305SPierre-Louis Bossart 					     ARRAY_SIZE(acpi_config_table));
746b5682305SPierre-Louis Bossart 	if (!cfg)
747b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
748b5682305SPierre-Louis Bossart 
749b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SST)
750b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SST;
751b5682305SPierre-Louis Bossart 
752b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SOF)
753b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SOF;
754b5682305SPierre-Louis Bossart 
755b5682305SPierre-Louis Bossart 	return SND_INTEL_DSP_DRIVER_SST;
756b5682305SPierre-Louis Bossart }
757b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe);
758b5682305SPierre-Louis Bossart 
75982d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2");
76082d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver");
76108c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
762