xref: /openbmc/linux/sound/hda/intel-dsp-config.c (revision 83de3ace)
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);
19*83de3aceSPeter Ujfalusi MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF, 4=AVS)");
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 /*
170905240d1SBrady Norander  * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake, AlderLake,
171905240d1SBrady Norander  * RaptorLake use legacy HDAudio driver except for Google Chromebooks
172905240d1SBrady Norander  * and when DMICs are present. Two cases are required since Coreboot
173905240d1SBrady 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 			},
339f09e16ebSMark Hasemeyer 			{
340f09e16ebSMark Hasemeyer 				.ident = "Google firmware",
341f09e16ebSMark Hasemeyer 				.matches = {
342f09e16ebSMark Hasemeyer 					DMI_MATCH(DMI_BIOS_VERSION, "Google"),
343f09e16ebSMark Hasemeyer 				}
344f09e16ebSMark Hasemeyer 			},
34519980aa1SBrent Lu 			{}
34619980aa1SBrent Lu 		}
34719980aa1SBrent Lu 	},
34819980aa1SBrent Lu 	{
34919980aa1SBrent Lu 		.flags = FLAG_SOF,
3500cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
351de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
352fa9730b4SPierre-Louis Bossart 	},
35319980aa1SBrent Lu 	{
35419980aa1SBrent Lu 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3550cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
35619980aa1SBrent Lu 	},
357fa9730b4SPierre-Louis Bossart #endif
358fa9730b4SPierre-Louis Bossart 
359cc8f81c7SPierre-Louis Bossart /* Tigerlake */
360cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
361cc8f81c7SPierre-Louis Bossart 	{
362cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
3630cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
364cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
365cc8f81c7SPierre-Louis Bossart 			{
366cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
367cc8f81c7SPierre-Louis Bossart 				.matches = {
368cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
369cc8f81c7SPierre-Louis Bossart 				}
370cc8f81c7SPierre-Louis Bossart 			},
37133fa35dbSPierre-Louis Bossart 			{
37233fa35dbSPierre-Louis Bossart 				.ident = "UPX-TGL",
37333fa35dbSPierre-Louis Bossart 				.matches = {
37433fa35dbSPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
37533fa35dbSPierre-Louis Bossart 				}
37633fa35dbSPierre-Louis Bossart 			},
377cc8f81c7SPierre-Louis Bossart 			{}
378cc8f81c7SPierre-Louis Bossart 		}
379cc8f81c7SPierre-Louis Bossart 	},
380cc8f81c7SPierre-Louis Bossart 	{
381081c7370SBrent Lu 		.flags = FLAG_SOF,
3820cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
383de24d97fSPierre-Louis Bossart 		.codec_hid =  &essx_83x6,
384081c7370SBrent Lu 	},
385081c7370SBrent Lu 	{
38606508575SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3870cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
388cc8f81c7SPierre-Louis Bossart 	},
389c5b5ff60SBard Liao 	{
390c5b5ff60SBard Liao 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3910cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_TGL_H,
392c5b5ff60SBard Liao 	},
393cc8f81c7SPierre-Louis Bossart #endif
394cc8f81c7SPierre-Louis Bossart 
395cc8f81c7SPierre-Louis Bossart /* Elkhart Lake */
396cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
397cc8f81c7SPierre-Louis Bossart 	{
398cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3990cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_EHL_0,
400cc8f81c7SPierre-Louis Bossart 	},
401114613f6SPierre-Louis Bossart 	{
402114613f6SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
4030cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_EHL_3,
404114613f6SPierre-Louis Bossart 	},
405cc8f81c7SPierre-Louis Bossart #endif
406cc8f81c7SPierre-Louis Bossart 
4070cd0a7c2SAmadeusz Sławiński /* Alder Lake / Raptor Lake */
408c4294d7fSKai Vehmanen #if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
409c4294d7fSKai Vehmanen 	{
410c4294d7fSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4110cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_S,
412c4294d7fSKai Vehmanen 	},
413d52eee98SPierre-Louis Bossart 	{
414d52eee98SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4150cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_S,
416d52eee98SPierre-Louis Bossart 	},
417c4294d7fSKai Vehmanen 	{
4182ec8b081SMuralidhar Reddy 		.flags = FLAG_SOF,
4190cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
420905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
421905240d1SBrady Norander 			{
422905240d1SBrady Norander 				.ident = "Google Chromebooks",
423905240d1SBrady Norander 				.matches = {
424905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
425905240d1SBrady Norander 				}
426905240d1SBrady Norander 			},
427905240d1SBrady Norander 			{}
428905240d1SBrady Norander 		}
429905240d1SBrady Norander 	},
430905240d1SBrady Norander 	{
431905240d1SBrady Norander 		.flags = FLAG_SOF,
432905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
4332ec8b081SMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4342ec8b081SMuralidhar Reddy 	},
4352ec8b081SMuralidhar Reddy 	{
436c4294d7fSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4370cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
438c4294d7fSKai Vehmanen 	},
4394ad7935dSKai Vehmanen 	{
4404ad7935dSKai Vehmanen 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4410cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX,
442ca1ece24SKai Vehmanen 	},
443d52eee98SPierre-Louis Bossart 	{
4449db1c9faSMuralidhar Reddy 		.flags = FLAG_SOF,
4450cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
4469db1c9faSMuralidhar Reddy 		.codec_hid =  &essx_83x6,
4479db1c9faSMuralidhar Reddy 	},
4489db1c9faSMuralidhar Reddy 	{
449d52eee98SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4500cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
451b07908abSGongjun Song 	},
452b07908abSGongjun Song 	{
453b07908abSGongjun Song 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4540cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_M,
455b07908abSGongjun Song 	},
456c35fbea4SPierre-Louis Bossart 	{
457905240d1SBrady Norander 		.flags = FLAG_SOF,
458905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
459905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
460905240d1SBrady Norander 			{
461905240d1SBrady Norander 				.ident = "Google Chromebooks",
462905240d1SBrady Norander 				.matches = {
463905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
464905240d1SBrady Norander 				}
465905240d1SBrady Norander 			},
466905240d1SBrady Norander 			{}
467905240d1SBrady Norander 		}
468905240d1SBrady Norander 	},
469905240d1SBrady Norander 	{
470c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4710cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
472c35fbea4SPierre-Louis Bossart 	},
473c35fbea4SPierre-Louis Bossart 	{
474905240d1SBrady Norander 		.flags = FLAG_SOF,
475905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
476905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
477905240d1SBrady Norander 			{
478905240d1SBrady Norander 				.ident = "Google Chromebooks",
479905240d1SBrady Norander 				.matches = {
480905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
481905240d1SBrady Norander 				}
482905240d1SBrady Norander 			},
483905240d1SBrady Norander 			{}
484905240d1SBrady Norander 		}
485905240d1SBrady Norander 	},
486905240d1SBrady Norander 	{
487c35fbea4SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4880cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
4890cd0a7c2SAmadeusz Sławiński 	},
4900cd0a7c2SAmadeusz Sławiński 	{
491905240d1SBrady Norander 		.flags = FLAG_SOF,
492905240d1SBrady Norander 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
493905240d1SBrady Norander 		.dmi_table = (const struct dmi_system_id []) {
494905240d1SBrady Norander 			{
495905240d1SBrady Norander 				.ident = "Google Chromebooks",
496905240d1SBrady Norander 				.matches = {
497905240d1SBrady Norander 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
498905240d1SBrady Norander 				}
499905240d1SBrady Norander 			},
500905240d1SBrady Norander 			{}
501905240d1SBrady Norander 		}
502905240d1SBrady Norander 	},
503905240d1SBrady Norander 	{
5040cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5050cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
5060cd0a7c2SAmadeusz Sławiński 	},
5070cd0a7c2SAmadeusz Sławiński 	{
5080cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5090cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_M,
5100cd0a7c2SAmadeusz Sławiński 	},
5110cd0a7c2SAmadeusz Sławiński 	{
5120cd0a7c2SAmadeusz Sławiński 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5130cd0a7c2SAmadeusz Sławiński 		.device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX,
514c35fbea4SPierre-Louis Bossart 	},
515c4294d7fSKai Vehmanen #endif
516c4294d7fSKai Vehmanen 
517bbdf904bSBard Liao /* Meteor Lake */
518bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE)
519bbdf904bSBard Liao 	/* Meteorlake-P */
520bbdf904bSBard Liao 	{
521bbdf904bSBard Liao 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
52273e6ebf6SPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_MTL,
523bbdf904bSBard Liao 	},
52470cb71c9SPierre-Louis Bossart 	/* ArrowLake-S */
52570cb71c9SPierre-Louis Bossart 	{
52670cb71c9SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
52770cb71c9SPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_ARL_S,
52870cb71c9SPierre-Louis Bossart 	},
52970cb71c9SPierre-Louis Bossart 	/* ArrowLake */
53070cb71c9SPierre-Louis Bossart 	{
53170cb71c9SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
53270cb71c9SPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_ARL,
53370cb71c9SPierre-Louis Bossart 	},
534bbdf904bSBard Liao #endif
535bbdf904bSBard Liao 
536d2852b8cSPierre-Louis Bossart /* Lunar Lake */
537d2852b8cSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_LUNARLAKE)
538d2852b8cSPierre-Louis Bossart 	/* Lunarlake-P */
539d2852b8cSPierre-Louis Bossart 	{
540d2852b8cSPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
541d2852b8cSPierre-Louis Bossart 		.device = PCI_DEVICE_ID_INTEL_HDA_LNL_P,
542d2852b8cSPierre-Louis Bossart 	},
543d2852b8cSPierre-Louis Bossart #endif
54482d9d54aSJaroslav Kysela };
54582d9d54aSJaroslav Kysela 
snd_intel_dsp_find_config(struct pci_dev * pci,const struct config_entry * table,u32 len)54682d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config
54782d9d54aSJaroslav Kysela 		(struct pci_dev *pci, const struct config_entry *table, u32 len)
54882d9d54aSJaroslav Kysela {
54982d9d54aSJaroslav Kysela 	u16 device;
55082d9d54aSJaroslav Kysela 
55182d9d54aSJaroslav Kysela 	device = pci->device;
55282d9d54aSJaroslav Kysela 	for (; len > 0; len--, table++) {
55382d9d54aSJaroslav Kysela 		if (table->device != device)
55482d9d54aSJaroslav Kysela 			continue;
55582d9d54aSJaroslav Kysela 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
55682d9d54aSJaroslav Kysela 			continue;
557de24d97fSPierre-Louis Bossart 		if (table->codec_hid) {
558de24d97fSPierre-Louis Bossart 			int i;
559de24d97fSPierre-Louis Bossart 
560cc73306bSPierre-Louis Bossart 			for (i = 0; i < table->codec_hid->num_codecs; i++) {
561cc73306bSPierre-Louis Bossart 				struct nhlt_acpi_table *nhlt;
562cc73306bSPierre-Louis Bossart 				bool ssp_found = false;
563cc73306bSPierre-Louis Bossart 
564cc73306bSPierre-Louis Bossart 				if (!acpi_dev_present(table->codec_hid->codecs[i], NULL, -1))
565cc73306bSPierre-Louis Bossart 					continue;
566cc73306bSPierre-Louis Bossart 
567cc73306bSPierre-Louis Bossart 				nhlt = intel_nhlt_init(&pci->dev);
568cc73306bSPierre-Louis Bossart 				if (!nhlt) {
569cc73306bSPierre-Louis Bossart 					dev_warn(&pci->dev, "%s: NHLT table not found, skipped HID %s\n",
570cc73306bSPierre-Louis Bossart 						 __func__, table->codec_hid->codecs[i]);
571cc73306bSPierre-Louis Bossart 					continue;
572cc73306bSPierre-Louis Bossart 				}
573cc73306bSPierre-Louis Bossart 
574cc73306bSPierre-Louis Bossart 				if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_SSP) &&
575cc73306bSPierre-Louis Bossart 				    intel_nhlt_ssp_endpoint_mask(nhlt, NHLT_DEVICE_I2S))
576cc73306bSPierre-Louis Bossart 					ssp_found = true;
577cc73306bSPierre-Louis Bossart 
578cc73306bSPierre-Louis Bossart 				intel_nhlt_free(nhlt);
579cc73306bSPierre-Louis Bossart 
580cc73306bSPierre-Louis Bossart 				if (ssp_found)
581de24d97fSPierre-Louis Bossart 					break;
582cc73306bSPierre-Louis Bossart 
583cc73306bSPierre-Louis Bossart 				dev_warn(&pci->dev, "%s: no valid SSP found for HID %s, skipped\n",
584cc73306bSPierre-Louis Bossart 					 __func__, table->codec_hid->codecs[i]);
585cc73306bSPierre-Louis Bossart 			}
586de24d97fSPierre-Louis Bossart 			if (i == table->codec_hid->num_codecs)
5879d36ceabSPierre-Louis Bossart 				continue;
588de24d97fSPierre-Louis Bossart 		}
58982d9d54aSJaroslav Kysela 		return table;
59082d9d54aSJaroslav Kysela 	}
59182d9d54aSJaroslav Kysela 	return NULL;
59282d9d54aSJaroslav Kysela }
59382d9d54aSJaroslav Kysela 
snd_intel_dsp_check_dmic(struct pci_dev * pci)59482d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
59582d9d54aSJaroslav Kysela {
59682d9d54aSJaroslav Kysela 	struct nhlt_acpi_table *nhlt;
59782d9d54aSJaroslav Kysela 	int ret = 0;
59882d9d54aSJaroslav Kysela 
59982d9d54aSJaroslav Kysela 	nhlt = intel_nhlt_init(&pci->dev);
60082d9d54aSJaroslav Kysela 	if (nhlt) {
6018235a08bSAmadeusz Sławiński 		if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC))
60282d9d54aSJaroslav Kysela 			ret = 1;
60382d9d54aSJaroslav Kysela 		intel_nhlt_free(nhlt);
60482d9d54aSJaroslav Kysela 	}
60582d9d54aSJaroslav Kysela 	return ret;
60682d9d54aSJaroslav Kysela }
60782d9d54aSJaroslav Kysela 
60806508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
snd_intel_dsp_check_soundwire(struct pci_dev * pci)60906508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
61006508575SPierre-Louis Bossart {
61106508575SPierre-Louis Bossart 	struct sdw_intel_acpi_info info;
61206508575SPierre-Louis Bossart 	acpi_handle handle;
61306508575SPierre-Louis Bossart 	int ret;
61406508575SPierre-Louis Bossart 
61506508575SPierre-Louis Bossart 	handle = ACPI_HANDLE(&pci->dev);
61606508575SPierre-Louis Bossart 
61706508575SPierre-Louis Bossart 	ret = sdw_intel_acpi_scan(handle, &info);
61806508575SPierre-Louis Bossart 	if (ret < 0)
61906508575SPierre-Louis Bossart 		return ret;
62006508575SPierre-Louis Bossart 
62106508575SPierre-Louis Bossart 	return info.link_mask;
62206508575SPierre-Louis Bossart }
62306508575SPierre-Louis Bossart #else
snd_intel_dsp_check_soundwire(struct pci_dev * pci)62406508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
62506508575SPierre-Louis Bossart {
62606508575SPierre-Louis Bossart 	return 0;
62706508575SPierre-Louis Bossart }
62806508575SPierre-Louis Bossart #endif
62906508575SPierre-Louis Bossart 
snd_intel_dsp_driver_probe(struct pci_dev * pci)63082d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci)
63182d9d54aSJaroslav Kysela {
63282d9d54aSJaroslav Kysela 	const struct config_entry *cfg;
63382d9d54aSJaroslav Kysela 
63491636a82STakashi Iwai 	/* Intel vendor only */
6350cd0a7c2SAmadeusz Sławiński 	if (pci->vendor != PCI_VENDOR_ID_INTEL)
63691636a82STakashi Iwai 		return SND_INTEL_DSP_DRIVER_ANY;
63791636a82STakashi Iwai 
6380e5cc221SPierre-Louis Bossart 	/*
6390e5cc221SPierre-Louis Bossart 	 * Legacy devices don't have a PCI-based DSP and use HDaudio
6400e5cc221SPierre-Louis Bossart 	 * for HDMI/DP support, ignore kernel parameter
6410e5cc221SPierre-Louis Bossart 	 */
6420e5cc221SPierre-Louis Bossart 	switch (pci->device) {
6430cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BDW:
6440cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_0:
6450cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_2:
6460cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_HSW_3:
6470cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BYT:
6480cd0a7c2SAmadeusz Sławiński 	case PCI_DEVICE_ID_INTEL_HDA_BSW:
6490e5cc221SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
6500e5cc221SPierre-Louis Bossart 	}
6510e5cc221SPierre-Louis Bossart 
65282d9d54aSJaroslav Kysela 	if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
65382d9d54aSJaroslav Kysela 		return dsp_driver;
65482d9d54aSJaroslav Kysela 
65582d9d54aSJaroslav Kysela 	/*
65682d9d54aSJaroslav Kysela 	 * detect DSP by checking class/subclass/prog-id information
65782d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
65882d9d54aSJaroslav Kysela 	 * class=04 subclass 01 prog-if 00: DSP is present
65982d9d54aSJaroslav Kysela 	 *  (and may be required e.g. for DMIC or SSP support)
66082d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 80: use DSP or legacy mode
66182d9d54aSJaroslav Kysela 	 */
66282d9d54aSJaroslav Kysela 	if (pci->class == 0x040300)
66382d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
66482d9d54aSJaroslav Kysela 	if (pci->class != 0x040100 && pci->class != 0x040380) {
665b79de57bSPierre-Louis Bossart 		dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class);
66682d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
66782d9d54aSJaroslav Kysela 	}
66882d9d54aSJaroslav Kysela 
66982d9d54aSJaroslav Kysela 	dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
67082d9d54aSJaroslav Kysela 
67182d9d54aSJaroslav Kysela 	/* find the configuration for the specific device */
67282d9d54aSJaroslav Kysela 	cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
67382d9d54aSJaroslav Kysela 	if (!cfg)
67482d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_ANY;
67582d9d54aSJaroslav Kysela 
67682d9d54aSJaroslav Kysela 	if (cfg->flags & FLAG_SOF) {
67706508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
67806508575SPierre-Louis Bossart 		    snd_intel_dsp_check_soundwire(pci) > 0) {
67906508575SPierre-Louis Bossart 			dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
68006508575SPierre-Louis Bossart 			return SND_INTEL_DSP_DRIVER_SOF;
68106508575SPierre-Louis Bossart 		}
68206508575SPierre-Louis Bossart 		if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
68306508575SPierre-Louis Bossart 		    snd_intel_dsp_check_dmic(pci)) {
68482d9d54aSJaroslav Kysela 			dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
68582d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
68682d9d54aSJaroslav Kysela 		}
68706508575SPierre-Louis Bossart 		if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
68882d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
68982d9d54aSJaroslav Kysela 	}
69082d9d54aSJaroslav Kysela 
691df1fceacSCezary Rojewski 
692df1fceacSCezary Rojewski 	if (cfg->flags & FLAG_SST) {
693df1fceacSCezary Rojewski 		if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) {
694df1fceacSCezary Rojewski 			if (snd_intel_dsp_check_dmic(pci)) {
695df1fceacSCezary Rojewski 				dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
69682d9d54aSJaroslav Kysela 				return SND_INTEL_DSP_DRIVER_SST;
697df1fceacSCezary Rojewski 			}
698df1fceacSCezary Rojewski 		} else {
699df1fceacSCezary Rojewski 			return SND_INTEL_DSP_DRIVER_SST;
700df1fceacSCezary Rojewski 		}
701df1fceacSCezary Rojewski 	}
70282d9d54aSJaroslav Kysela 
70382d9d54aSJaroslav Kysela 	return SND_INTEL_DSP_DRIVER_LEGACY;
70482d9d54aSJaroslav Kysela }
70582d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
70682d9d54aSJaroslav Kysela 
7075427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */
7085427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
7095427c7d6SHans de Goede     !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
7105427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SOF
7115427c7d6SHans de Goede #else
7125427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT	FLAG_SST
7135427c7d6SHans de Goede #endif
7145427c7d6SHans de Goede 
715b5682305SPierre-Louis Bossart /*
716b5682305SPierre-Louis Bossart  * configuration table
717b5682305SPierre-Louis Bossart  * - the order of similar ACPI ID entries is important!
718b5682305SPierre-Louis Bossart  * - the first successful match will win
719b5682305SPierre-Louis Bossart  */
720b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = {
7215427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
7225427c7d6SHans de Goede     IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
723b5682305SPierre-Louis Bossart /* BayTrail */
724b5682305SPierre-Louis Bossart 	{
7255427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
726b5682305SPierre-Louis Bossart 		.acpi_hid = "80860F28",
727b5682305SPierre-Louis Bossart 	},
728b5682305SPierre-Louis Bossart /* CherryTrail */
729b5682305SPierre-Louis Bossart 	{
7305427c7d6SHans de Goede 		.flags = FLAG_SST_OR_SOF_BYT,
731b5682305SPierre-Louis Bossart 		.acpi_hid = "808622A8",
732b5682305SPierre-Louis Bossart 	},
733b5682305SPierre-Louis Bossart #endif
734803e5913SPierre-Louis Bossart /* Broadwell */
735803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
736803e5913SPierre-Louis Bossart 	{
737803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
738803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
739803e5913SPierre-Louis Bossart 	},
740803e5913SPierre-Louis Bossart #endif
741803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL)
742803e5913SPierre-Louis Bossart 	{
743803e5913SPierre-Louis Bossart 		.flags = FLAG_SOF,
744803e5913SPierre-Louis Bossart 		.acpi_hid = "INT3438"
745803e5913SPierre-Louis Bossart 	},
746803e5913SPierre-Louis Bossart #endif
747803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */
748803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
749803e5913SPierre-Louis Bossart 	{
750803e5913SPierre-Louis Bossart 		.flags = FLAG_SST,
751803e5913SPierre-Louis Bossart 		.acpi_hid = "INT33C8"
752803e5913SPierre-Louis Bossart 	},
753803e5913SPierre-Louis Bossart #endif
754b5682305SPierre-Louis Bossart };
755b5682305SPierre-Louis Bossart 
snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],const struct config_entry * table,u32 len)756b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],
757b5682305SPierre-Louis Bossart 								 const struct config_entry *table,
758b5682305SPierre-Louis Bossart 								 u32 len)
759b5682305SPierre-Louis Bossart {
760b5682305SPierre-Louis Bossart 	for (; len > 0; len--, table++) {
761b5682305SPierre-Louis Bossart 		if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN))
762b5682305SPierre-Louis Bossart 			continue;
763b5682305SPierre-Louis Bossart 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
764b5682305SPierre-Louis Bossart 			continue;
765b5682305SPierre-Louis Bossart 		return table;
766b5682305SPierre-Louis Bossart 	}
767b5682305SPierre-Louis Bossart 	return NULL;
768b5682305SPierre-Louis Bossart }
769b5682305SPierre-Louis Bossart 
snd_intel_acpi_dsp_driver_probe(struct device * dev,const u8 acpi_hid[ACPI_ID_LEN])770b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN])
771b5682305SPierre-Louis Bossart {
772b5682305SPierre-Louis Bossart 	const struct config_entry *cfg;
773b5682305SPierre-Louis Bossart 
774b5682305SPierre-Louis Bossart 	if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
775b5682305SPierre-Louis Bossart 		return dsp_driver;
776b5682305SPierre-Louis Bossart 
777b5682305SPierre-Louis Bossart 	if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) {
778b5682305SPierre-Louis Bossart 		dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n",
779b5682305SPierre-Louis Bossart 			 SND_INTEL_DSP_DRIVER_LEGACY);
780b5682305SPierre-Louis Bossart 	}
781b5682305SPierre-Louis Bossart 
782b5682305SPierre-Louis Bossart 	/* find the configuration for the specific device */
783b5682305SPierre-Louis Bossart 	cfg = snd_intel_acpi_dsp_find_config(acpi_hid,  acpi_config_table,
784b5682305SPierre-Louis Bossart 					     ARRAY_SIZE(acpi_config_table));
785b5682305SPierre-Louis Bossart 	if (!cfg)
786b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_ANY;
787b5682305SPierre-Louis Bossart 
788b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SST)
789b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SST;
790b5682305SPierre-Louis Bossart 
791b5682305SPierre-Louis Bossart 	if (cfg->flags & FLAG_SOF)
792b5682305SPierre-Louis Bossart 		return SND_INTEL_DSP_DRIVER_SOF;
793b5682305SPierre-Louis Bossart 
794b5682305SPierre-Louis Bossart 	return SND_INTEL_DSP_DRIVER_SST;
795b5682305SPierre-Louis Bossart }
796b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe);
797b5682305SPierre-Louis Bossart 
79882d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2");
79982d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver");
80008c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
801