xref: /openbmc/linux/sound/hda/intel-dsp-config.c (revision 0cd0a7c2)
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,
53*0cd0a7c2SAmadeusz 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,
64*0cd0a7c2SAmadeusz 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,
78*0cd0a7c2SAmadeusz 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,
85*0cd0a7c2SAmadeusz 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,
106*0cd0a7c2SAmadeusz 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,
119*0cd0a7c2SAmadeusz 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,
126*0cd0a7c2SAmadeusz 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,
139*0cd0a7c2SAmadeusz 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,
151*0cd0a7c2SAmadeusz 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,
164*0cd0a7c2SAmadeusz 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 /*
170cc8f81c7SPierre-Louis Bossart  * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake use legacy
171b79de57bSPierre-Louis Bossart  * HDAudio driver except for Google Chromebooks and when DMICs are
172cc8f81c7SPierre-Louis Bossart  * present. Two cases are required since Coreboot does not expose NHLT
173cc8f81c7SPierre-Louis Bossart  * 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,
184*0cd0a7c2SAmadeusz 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,
203*0cd0a7c2SAmadeusz 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,
208*0cd0a7c2SAmadeusz 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,
216*0cd0a7c2SAmadeusz 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,
229*0cd0a7c2SAmadeusz 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,
237*0cd0a7c2SAmadeusz 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,
263*0cd0a7c2SAmadeusz 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,
268*0cd0a7c2SAmadeusz 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,
273*0cd0a7c2SAmadeusz 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,
292*0cd0a7c2SAmadeusz 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,
297*0cd0a7c2SAmadeusz 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,
305*0cd0a7c2SAmadeusz 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,
318*0cd0a7c2SAmadeusz 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,
323*0cd0a7c2SAmadeusz 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,
331*0cd0a7c2SAmadeusz 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,
344*0cd0a7c2SAmadeusz 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,
349*0cd0a7c2SAmadeusz 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,
357*0cd0a7c2SAmadeusz 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,
376*0cd0a7c2SAmadeusz 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,
381*0cd0a7c2SAmadeusz 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,
385*0cd0a7c2SAmadeusz 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,
393*0cd0a7c2SAmadeusz 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,
397*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_EHL_3,
398114613f6SPierre-Louis Bossart 	},
399cc8f81c7SPierre-Louis Bossart #endif
400cc8f81c7SPierre-Louis Bossart 
401*0cd0a7c2SAmadeusz 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,
405*0cd0a7c2SAmadeusz 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,
409*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_S,
410d52eee98SPierre-Louis Bossart 	},
411c4294d7fSKai Vehmanen 	{
4122ec8b081SMuralidhar Reddy 		.flags = FLAG_SOF,
413*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
4142ec8b081SMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4152ec8b081SMuralidhar Reddy 	},
4162ec8b081SMuralidhar Reddy 	{
417c4294d7fSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
418*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
419c4294d7fSKai Vehmanen 	},
4204ad7935dSKai Vehmanen 	{
4214ad7935dSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
422*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX,
423ca1ece24SKai Vehmanen 	},
424d52eee98SPierre-Louis Bossart 	{
4259db1c9faSMuralidhar Reddy 		.flags = FLAG_SOF,
426*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
4279db1c9faSMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4289db1c9faSMuralidhar Reddy 	},
4299db1c9faSMuralidhar Reddy 	{
430d52eee98SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
431*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
432b07908abSGongjun Song 	},
433b07908abSGongjun Song 	{
434b07908abSGongjun Song 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
435*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_M,
436b07908abSGongjun Song 	},
437c35fbea4SPierre-Louis Bossart 	{
438c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
439*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
440c35fbea4SPierre-Louis Bossart 	},
441c35fbea4SPierre-Louis Bossart 	{
442c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
443*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
444*0cd0a7c2SAmadeusz Sławiński 	},
445*0cd0a7c2SAmadeusz Sławiński 	{
446*0cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
447*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
448*0cd0a7c2SAmadeusz Sławiński 	},
449*0cd0a7c2SAmadeusz Sławiński 	{
450*0cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
451*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_M,
452*0cd0a7c2SAmadeusz Sławiński 	},
453*0cd0a7c2SAmadeusz Sławiński 	{
454*0cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
455*0cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX,
456c35fbea4SPierre-Louis Bossart 	},
457c4294d7fSKai Vehmanen #endif
458c4294d7fSKai Vehmanen 
459bbdf904bSBard Liao /* Meteor Lake */
460bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE)
461bbdf904bSBard Liao 	/* Meteorlake-P */
462bbdf904bSBard Liao 	{
463bbdf904bSBard Liao 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
464bbdf904bSBard Liao 		.device = 0x7e28,
465bbdf904bSBard Liao 	},
466bbdf904bSBard Liao #endif
467bbdf904bSBard Liao 
46882d9d54aSJaroslav Kysela };
46982d9d54aSJaroslav Kysela 
47082d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config
47182d9d54aSJaroslav Kysela 		(struct pci_dev *pci, const struct config_entry *table, u32 len)
47282d9d54aSJaroslav Kysela {
47382d9d54aSJaroslav Kysela 	u16 device;
47482d9d54aSJaroslav Kysela 
47582d9d54aSJaroslav Kysela 	device = pci->device;
47682d9d54aSJaroslav Kysela 	for (; len > 0; len--, table++) {
47782d9d54aSJaroslav Kysela 		if (table->device != device)
47882d9d54aSJaroslav Kysela 			continue;
47982d9d54aSJaroslav Kysela 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
48082d9d54aSJaroslav Kysela 			continue;
481de24d97fSPierre-Louis Bossart 		if (table->codec_hid) {
482de24d97fSPierre-Louis Bossart 			int i;
483de24d97fSPierre-Louis Bossart 
484de24d97fSPierre-Louis Bossart 			for (i = 0; i < table->codec_hid->num_codecs; i++)
485de24d97fSPierre-Louis Bossart 				if (acpi_dev_present(table->codec_hid->codecs[i], NULL, -1))
486de24d97fSPierre-Louis Bossart 					break;
487de24d97fSPierre-Louis Bossart 			if (i == table->codec_hid->num_codecs)
4889d36ceabSPierre-Louis Bossart 				continue;
489de24d97fSPierre-Louis Bossart 		}
49082d9d54aSJaroslav Kysela 		return table;
49182d9d54aSJaroslav Kysela 	}
49282d9d54aSJaroslav Kysela 	return NULL;
49382d9d54aSJaroslav Kysela }
49482d9d54aSJaroslav Kysela 
49582d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
49682d9d54aSJaroslav Kysela {
49782d9d54aSJaroslav Kysela 	struct nhlt_acpi_table *nhlt;
49882d9d54aSJaroslav Kysela 	int ret = 0;
49982d9d54aSJaroslav Kysela 
50082d9d54aSJaroslav Kysela 	nhlt = intel_nhlt_init(&pci->dev);
50182d9d54aSJaroslav Kysela 	if (nhlt) {
5028235a08bSAmadeusz Sławiński 		if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC))
50382d9d54aSJaroslav Kysela 			ret = 1;
50482d9d54aSJaroslav Kysela 		intel_nhlt_free(nhlt);
50582d9d54aSJaroslav Kysela 	}
50682d9d54aSJaroslav Kysela 	return ret;
50782d9d54aSJaroslav Kysela }
50882d9d54aSJaroslav Kysela 
50906508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
51006508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
51106508575SPierre-Louis Bossart {
51206508575SPierre-Louis Bossart 	struct sdw_intel_acpi_info info;
51306508575SPierre-Louis Bossart 	acpi_handle handle;
51406508575SPierre-Louis Bossart 	int ret;
51506508575SPierre-Louis Bossart 
51606508575SPierre-Louis Bossart 	handle = ACPI_HANDLE(&pci->dev);
51706508575SPierre-Louis Bossart 
51806508575SPierre-Louis Bossart 	ret = sdw_intel_acpi_scan(handle, &info);
51906508575SPierre-Louis Bossart 	if (ret < 0)
52006508575SPierre-Louis Bossart 		return ret;
52106508575SPierre-Louis Bossart 
52206508575SPierre-Louis Bossart 	return info.link_mask;
52306508575SPierre-Louis Bossart }
52406508575SPierre-Louis Bossart #else
52506508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
52606508575SPierre-Louis Bossart {
52706508575SPierre-Louis Bossart 	return 0;
52806508575SPierre-Louis Bossart }
52906508575SPierre-Louis Bossart #endif
53006508575SPierre-Louis Bossart 
53182d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci)
53282d9d54aSJaroslav Kysela {
53382d9d54aSJaroslav Kysela 	const struct config_entry *cfg;
53482d9d54aSJaroslav Kysela 
53591636a82STakashi Iwai 	/* Intel vendor only */
536*0cd0a7c2SAmadeusz Sławiński 	if (pci->vendor != PCI_VENDOR_ID_INTEL)
53791636a82STakashi Iwai 		return SND_INTEL_DSP_DRIVER_ANY;
53891636a82STakashi Iwai 
5390e5cc221SPierre-Louis Bossart 	/*
5400e5cc221SPierre-Louis Bossart 	 * Legacy devices don't have a PCI-based DSP and use HDaudio
5410e5cc221SPierre-Louis Bossart 	 * for HDMI/DP support, ignore kernel parameter
5420e5cc221SPierre-Louis Bossart 	 */
5430e5cc221SPierre-Louis Bossart 	switch (pci->device) {
544*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BDW:
545*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_0:
546*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_2:
547*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_3:
548*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BYT:
549*0cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BSW:
5500e5cc221SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
5510e5cc221SPierre-Louis Bossart 	}
5520e5cc221SPierre-Louis Bossart 
55382d9d54aSJaroslav Kysela 	if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
55482d9d54aSJaroslav Kysela 		return dsp_driver;
55582d9d54aSJaroslav Kysela 
55682d9d54aSJaroslav Kysela 	/*
55782d9d54aSJaroslav Kysela 	 * detect DSP by checking class/subclass/prog-id information
55882d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
55982d9d54aSJaroslav Kysela 	 * class=04 subclass 01 prog-if 00: DSP is present
56082d9d54aSJaroslav Kysela 	 *  (and may be required e.g. for DMIC or SSP support)
56182d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 80: use DSP or legacy mode
56282d9d54aSJaroslav Kysela 	 */
56382d9d54aSJaroslav Kysela 	if (pci->class == 0x040300)
56482d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
56582d9d54aSJaroslav Kysela 	if (pci->class != 0x040100 && pci->class != 0x040380) {
566b79de57bSPierre-Louis Bossart 		dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class);
56782d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
56882d9d54aSJaroslav Kysela 	}
56982d9d54aSJaroslav Kysela 
57082d9d54aSJaroslav Kysela 	dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
57182d9d54aSJaroslav Kysela 
57282d9d54aSJaroslav Kysela 	/* find the configuration for the specific device */
57382d9d54aSJaroslav Kysela 	cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
57482d9d54aSJaroslav Kysela 	if (!cfg)
57582d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_ANY;
57682d9d54aSJaroslav Kysela 
57782d9d54aSJaroslav Kysela 	if (cfg->flags & FLAG_SOF) {
57806508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
57906508575SPierre-Louis Bossart 		    snd_intel_dsp_check_soundwire(pci) > 0) {
58006508575SPierre-Louis Bossart 			dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
58106508575SPierre-Louis Bossart 			return SND_INTEL_DSP_DRIVER_SOF;
58206508575SPierre-Louis Bossart 		}
58306508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
58406508575SPierre-Louis Bossart 		    snd_intel_dsp_check_dmic(pci)) {
58582d9d54aSJaroslav Kysela 			dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
58682d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
58782d9d54aSJaroslav Kysela 		}
58806508575SPierre-Louis Bossart 		if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
58982d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
59082d9d54aSJaroslav Kysela 	}
59182d9d54aSJaroslav Kysela 
592df1fceacSCezary Rojewski 
593df1fceacSCezary Rojewski 	if (cfg->flags & FLAG_SST) {
594df1fceacSCezary Rojewski 		if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) {
595df1fceacSCezary Rojewski 			if (snd_intel_dsp_check_dmic(pci)) {
596df1fceacSCezary Rojewski 				dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
59782d9d54aSJaroslav Kysela 				return SND_INTEL_DSP_DRIVER_SST;
598df1fceacSCezary Rojewski 			}
599df1fceacSCezary Rojewski 		} else {
600df1fceacSCezary Rojewski 			return SND_INTEL_DSP_DRIVER_SST;
601df1fceacSCezary Rojewski 		}
602df1fceacSCezary Rojewski 	}
60382d9d54aSJaroslav Kysela 
60482d9d54aSJaroslav Kysela 	return SND_INTEL_DSP_DRIVER_LEGACY;
60582d9d54aSJaroslav Kysela }
60682d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
60782d9d54aSJaroslav Kysela 
6085427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */
6095427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
6105427c7d6SHans de Goede     !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
6115427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SOF
6125427c7d6SHans de Goede #else
6135427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SST
6145427c7d6SHans de Goede #endif
6155427c7d6SHans de Goede 
616b5682305SPierre-Louis Bossart /*
617b5682305SPierre-Louis Bossart  * configuration table
618b5682305SPierre-Louis Bossart  * - the order of similar ACPI ID entries is important!
619b5682305SPierre-Louis Bossart  * - the first successful match will win
620b5682305SPierre-Louis Bossart  */
621b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = {
6225427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
6235427c7d6SHans de Goede     IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
624b5682305SPierre-Louis Bossart /* BayTrail */
625b5682305SPierre-Louis Bossart 	{
6265427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
627b5682305SPierre-Louis Bossart 		.acpi_hid = "80860F28",
628b5682305SPierre-Louis Bossart 	},
629b5682305SPierre-Louis Bossart /* CherryTrail */
630b5682305SPierre-Louis Bossart 	{
6315427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
632b5682305SPierre-Louis Bossart 		.acpi_hid = "808622A8",
633b5682305SPierre-Louis Bossart 	},
634b5682305SPierre-Louis Bossart #endif
635803e5913SPierre-Louis Bossart /* Broadwell */
636803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
637803e5913SPierre-Louis Bossart 	{
638803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
639803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
640803e5913SPierre-Louis Bossart 	},
641803e5913SPierre-Louis Bossart #endif
642803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL)
643803e5913SPierre-Louis Bossart 	{
644803e5913SPierre-Louis Bossart 		.flags = FLAG_SOF,
645803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
646803e5913SPierre-Louis Bossart 	},
647803e5913SPierre-Louis Bossart #endif
648803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */
649803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
650803e5913SPierre-Louis Bossart 	{
651803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
652803e5913SPierre-Louis Bossart 		.acpi_hid = "INT33C8"
653803e5913SPierre-Louis Bossart 	},
654803e5913SPierre-Louis Bossart #endif
655b5682305SPierre-Louis Bossart };
656b5682305SPierre-Louis Bossart 
657b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],
658b5682305SPierre-Louis Bossart 								 const struct config_entry *table,
659b5682305SPierre-Louis Bossart 								 u32 len)
660b5682305SPierre-Louis Bossart {
661b5682305SPierre-Louis Bossart 	for (; len > 0; len--, table++) {
662b5682305SPierre-Louis Bossart 		if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN))
663b5682305SPierre-Louis Bossart 			continue;
664b5682305SPierre-Louis Bossart 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
665b5682305SPierre-Louis Bossart 			continue;
666b5682305SPierre-Louis Bossart 		return table;
667b5682305SPierre-Louis Bossart 	}
668b5682305SPierre-Louis Bossart 	return NULL;
669b5682305SPierre-Louis Bossart }
670b5682305SPierre-Louis Bossart 
671b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN])
672b5682305SPierre-Louis Bossart {
673b5682305SPierre-Louis Bossart 	const struct config_entry *cfg;
674b5682305SPierre-Louis Bossart 
675b5682305SPierre-Louis Bossart 	if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
676b5682305SPierre-Louis Bossart 		return dsp_driver;
677b5682305SPierre-Louis Bossart 
678b5682305SPierre-Louis Bossart 	if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) {
679b5682305SPierre-Louis Bossart 		dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n",
680b5682305SPierre-Louis Bossart 			 SND_INTEL_DSP_DRIVER_LEGACY);
681b5682305SPierre-Louis Bossart 	}
682b5682305SPierre-Louis Bossart 
683b5682305SPierre-Louis Bossart 	/* find the configuration for the specific device */
684b5682305SPierre-Louis Bossart 	cfg = snd_intel_acpi_dsp_find_config(acpi_hid,  acpi_config_table,
685b5682305SPierre-Louis Bossart 					     ARRAY_SIZE(acpi_config_table));
686b5682305SPierre-Louis Bossart 	if (!cfg)
687b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
688b5682305SPierre-Louis Bossart 
689b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SST)
690b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SST;
691b5682305SPierre-Louis Bossart 
692b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SOF)
693b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SOF;
694b5682305SPierre-Louis Bossart 
695b5682305SPierre-Louis Bossart 	return SND_INTEL_DSP_DRIVER_SST;
696b5682305SPierre-Louis Bossart }
697b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe);
698b5682305SPierre-Louis Bossart 
69982d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2");
70082d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver");
70108c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
702