xref: /linux/sound/soc/amd/acp-config.c (revision d5a821f66047c2effd06147b84775f9b2ce0f4aa)
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2 //
3 // This file is provided under a dual BSD/GPLv2 license. When using or
4 // redistributing this file, you may do so under either license.
5 //
6 // Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.
7 //
8 // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
9 //
10 
11 /* ACP machine configuration module */
12 
13 #include <linux/acpi.h>
14 #include <linux/bits.h>
15 #include <linux/dmi.h>
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 
19 #include "../sof/amd/acp.h"
20 #include "mach-config.h"
21 
22 #define ACP_7_0_REV	0x70
23 
24 static int acp_quirk_data;
25 
26 static const struct dmi_system_id acp70_acpi_flag_override_table[] = {
27 	{
28 		.matches = {
29 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
30 			DMI_MATCH(DMI_PRODUCT_NAME, "HN7306EA"),
31 		},
32 	},
33 	{
34 		/* ASUS EXPERTBOOK AM7406CKA (Kraken Point, ACP 7.0) */
35 		.matches = {
36 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
37 			DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK AM7406CKA"),
38 		},
39 	},
40 	{
41 		/* ASUS Zenbook S16 UM5606GA (Strix Point, ACP 7.0) */
42 		.matches = {
43 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
44 			DMI_MATCH(DMI_PRODUCT_NAME, "Zenbook S16 UM5606GA"),
45 		},
46 	},
47 	{
48 		/* Lenovo Yoga Pro 7 15ASH11 (Strix Halo, ACP 7.0) */
49 		.matches = {
50 			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
51 			DMI_MATCH(DMI_PRODUCT_NAME, "83W5"),
52 		},
53 	},
54 	{
55 		/* Lenovo Legion 7 15ASH11 (Strix Halo, ACP 7.0) */
56 		.matches = {
57 			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
58 			DMI_MATCH(DMI_PRODUCT_NAME, "83V9"),
59 		},
60 	},
61 	{
62 		/* Lenovo Yoga Pro 7 14ASP9 (Strix Point, ACP 7.0) */
63 		.matches = {
64 			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
65 			DMI_MATCH(DMI_PRODUCT_NAME, "83HN"),
66 		},
67 	},
68 	{
69 		.matches = {
70 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC"),
71 			DMI_MATCH(DMI_PRODUCT_NAME, "FA401EA"),
72 		},
73 	},
74 	{
75 		.matches = {
76 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC"),
77 			DMI_MATCH(DMI_PRODUCT_NAME, "Vivobook 18 M1807GA"),
78 		},
79 	},
80 	{
81 		/* ASUS Zenbook S14 UM5406GA (Strix Point, ACP 7.0) */
82 		.matches = {
83 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
84 			DMI_MATCH(DMI_PRODUCT_NAME, "Zenbook S14 UM5406GA"),
85 		},
86 	},
87 	{
88 		/* HP OmniBook X Flip 14-kc0xxx (Strix Point, ACP 7.2) */
89 		.matches = {
90 			DMI_MATCH(DMI_BOARD_VENDOR, "HP"),
91 			DMI_MATCH(DMI_BOARD_NAME, "8EA1"),
92 		},
93 	},
94 	{
95 		/* HP OmniBook X Flip 16-cc0xxx */
96 		.matches = {
97 			DMI_MATCH(DMI_BOARD_VENDOR, "HP"),
98 			DMI_MATCH(DMI_BOARD_NAME, "8EA2"),
99 		},
100 	},
101 	{}
102 };
103 
104 static const struct config_entry config_table[] = {
105 	{
106 		.flags = FLAG_AMD_SOF,
107 		.device = ACP_PCI_DEV_ID,
108 		.dmi_table = (const struct dmi_system_id []) {
109 			{
110 				.matches = {
111 					DMI_MATCH(DMI_SYS_VENDOR, "AMD"),
112 					DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"),
113 				},
114 			},
115 			{}
116 		},
117 	},
118 	{
119 		.flags = FLAG_AMD_SOF,
120 		.device = ACP_PCI_DEV_ID,
121 		.dmi_table = (const struct dmi_system_id []) {
122 			{
123 				.matches = {
124 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
125 				},
126 			},
127 			{}
128 		},
129 	},
130 	{
131 		.flags = FLAG_AMD_LEGACY,
132 		.device = ACP_PCI_DEV_ID,
133 		.dmi_table = (const struct dmi_system_id []) {
134 			{
135 				.matches = {
136 					DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
137 					DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"),
138 				},
139 			},
140 			{}
141 		},
142 	},
143 	{
144 		.flags = FLAG_AMD_SOF,
145 		.device = ACP_PCI_DEV_ID,
146 		.dmi_table = (const struct dmi_system_id []) {
147 			{
148 				.matches = {
149 					DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
150 					DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
151 				},
152 			},
153 			{}
154 		},
155 	},
156 	{
157 		.flags = FLAG_AMD_LEGACY,
158 		.device = ACP_PCI_DEV_ID,
159 		.dmi_table = (const struct dmi_system_id []) {
160 			{
161 				.matches = {
162 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
163 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"),
164 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
165 				},
166 			},
167 			{}
168 		},
169 	},
170 	{
171 		.flags = FLAG_AMD_LEGACY,
172 		.device = ACP_PCI_DEV_ID,
173 		.dmi_table = (const struct dmi_system_id []) {
174 			{
175 				.matches = {
176 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
177 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"),
178 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
179 				},
180 			},
181 			{}
182 		},
183 	},
184 	{
185 		.flags = FLAG_AMD_LEGACY,
186 		.device = ACP_PCI_DEV_ID,
187 		.dmi_table = (const struct dmi_system_id []) {
188 			{
189 				.matches = {
190 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
191 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"),
192 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
193 				},
194 			},
195 			{}
196 		},
197 	},
198 	{
199 		.flags = FLAG_AMD_LEGACY,
200 		.device = ACP_PCI_DEV_ID,
201 		.dmi_table = (const struct dmi_system_id []) {
202 			{
203 				.matches = {
204 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
205 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
206 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
207 				},
208 			},
209 			{}
210 		},
211 	},
212 	{
213 		.flags = FLAG_AMD_LEGACY,
214 		.device = ACP_PCI_DEV_ID,
215 		.dmi_table = (const struct dmi_system_id []) {
216 			{
217 				.matches = {
218 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
219 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
220 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"),
221 				},
222 			},
223 			{}
224 		},
225 	},
226 	{
227 		.flags = FLAG_AMD_LEGACY,
228 		.device = ACP_PCI_DEV_ID,
229 		.dmi_table = (const struct dmi_system_id []) {
230 			{
231 				.matches = {
232 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
233 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
234 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"),
235 				},
236 			},
237 			{}
238 		},
239 	},
240 	{
241 		.flags = FLAG_AMD_LEGACY,
242 		.device = ACP_PCI_DEV_ID,
243 		.dmi_table = (const struct dmi_system_id []) {
244 			{
245 				.matches = {
246 					DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
247 					DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
248 					DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1060"),
249 				},
250 			},
251 			{}
252 		},
253 	},
254 };
255 
snd_amd_acp_acpi_find_config(struct pci_dev * pci)256 static int snd_amd_acp_acpi_find_config(struct pci_dev *pci)
257 {
258 	const union acpi_object *obj;
259 	int acp_flag = FLAG_AMD_LEGACY_ONLY_DMIC;
260 
261 	if (!acpi_dev_get_property(ACPI_COMPANION(&pci->dev), "acp-audio-config-flag",
262 				   ACPI_TYPE_INTEGER, &obj))
263 		acp_flag = obj->integer.value;
264 
265 	return acp_flag;
266 }
267 
snd_amd_acp_find_config(struct pci_dev * pci)268 int snd_amd_acp_find_config(struct pci_dev *pci)
269 {
270 	const struct config_entry *table = config_table;
271 	u16 device = pci->device;
272 	int i;
273 
274 	/* Do not enable FLAGS on older platforms with Rev Id zero
275 	 * For platforms which has ACP 7.0 or higher, read the acp
276 	 * config flag from BIOS ACPI table and for older platforms
277 	 * read it from DMI tables.
278 	 */
279 	if (!pci->revision)
280 		return 0;
281 	else if (pci->revision >= ACP_7_0_REV) {
282 		if (dmi_check_system(acp70_acpi_flag_override_table))
283 			return 0;
284 		return snd_amd_acp_acpi_find_config(pci);
285 	}
286 
287 	for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {
288 		if (table->device != device)
289 			continue;
290 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
291 			continue;
292 		acp_quirk_data = table->flags;
293 		return table->flags;
294 	}
295 
296 	return 0;
297 }
298 EXPORT_SYMBOL(snd_amd_acp_find_config);
299 
300 static struct snd_soc_acpi_codecs amp_rt1019 = {
301 	.num_codecs = 1,
302 	.codecs = {"10EC1019"}
303 };
304 
305 static struct snd_soc_acpi_codecs amp_max = {
306 	.num_codecs = 1,
307 	.codecs = {"MX98360A"}
308 };
309 
310 static struct snd_soc_acpi_codecs amp_max98388 = {
311 	.num_codecs = 1,
312 	.codecs = {"ADS8388"}
313 };
314 
315 struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = {
316 	{
317 		.id = "10EC5682",
318 		.drv_name = "rt5682-rt1019",
319 		.pdata = (void *)&acp_quirk_data,
320 		.machine_quirk = snd_soc_acpi_codec_list,
321 		.quirk_data = &amp_rt1019,
322 		.fw_filename = "sof-rn.ri",
323 		.sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
324 	},
325 	{
326 		.id = "10EC5682",
327 		.drv_name = "rt5682-max",
328 		.pdata = (void *)&acp_quirk_data,
329 		.machine_quirk = snd_soc_acpi_codec_list,
330 		.quirk_data = &amp_max,
331 		.fw_filename = "sof-rn.ri",
332 		.sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
333 	},
334 	{
335 		.id = "RTL5682",
336 		.drv_name = "rt5682s-max",
337 		.pdata = (void *)&acp_quirk_data,
338 		.machine_quirk = snd_soc_acpi_codec_list,
339 		.quirk_data = &amp_max,
340 		.fw_filename = "sof-rn.ri",
341 		.sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
342 	},
343 	{
344 		.id = "RTL5682",
345 		.drv_name = "rt5682s-rt1019",
346 		.pdata = (void *)&acp_quirk_data,
347 		.machine_quirk = snd_soc_acpi_codec_list,
348 		.quirk_data = &amp_rt1019,
349 		.fw_filename = "sof-rn.ri",
350 		.sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
351 	},
352 	{
353 		.id = "AMDI1019",
354 		.drv_name = "renoir-dsp",
355 		.pdata = (void *)&acp_quirk_data,
356 		.fw_filename = "sof-rn.ri",
357 		.sof_tplg_filename = "sof-acp.tplg",
358 	},
359 	{},
360 };
361 EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines);
362 
363 struct snd_soc_acpi_mach snd_soc_acpi_amd_vangogh_sof_machines[] = {
364 	{
365 		.id = "NVTN2020",
366 		.drv_name = "nau8821-max",
367 		.pdata = &acp_quirk_data,
368 		.machine_quirk = snd_soc_acpi_codec_list,
369 		.quirk_data = &amp_max98388,
370 		.fw_filename = "sof-vangogh.ri",
371 		.sof_tplg_filename = "sof-vangogh-nau8821-max.tplg",
372 	},
373 	{},
374 };
375 EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines);
376 
377 struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_sof_machines[] = {
378 	{
379 		.id = "AMDI1019",
380 		.drv_name = "rmb-dsp",
381 		.pdata = &acp_quirk_data,
382 		.fw_filename = "sof-rmb.ri",
383 		.sof_tplg_filename = "sof-acp-rmb.tplg",
384 	},
385 	{
386 		.id = "10508825",
387 		.drv_name = "nau8825-max",
388 		.pdata = &acp_quirk_data,
389 		.machine_quirk = snd_soc_acpi_codec_list,
390 		.quirk_data = &amp_max,
391 		.fw_filename = "sof-rmb.ri",
392 		.sof_tplg_filename = "sof-rmb-nau8825-max98360.tplg",
393 	},
394 	{
395 		.id = "RTL5682",
396 		.drv_name = "rt5682s-hs-rt1019",
397 		.pdata = &acp_quirk_data,
398 		.machine_quirk = snd_soc_acpi_codec_list,
399 		.quirk_data = &amp_rt1019,
400 		.fw_filename = "sof-rmb.ri",
401 		.sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg",
402 	},
403 	{},
404 };
405 EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines);
406 
407 struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sof_machines[] = {
408 	{
409 		.id = "AMDI1019",
410 		.drv_name = "acp63-dsp",
411 		.pdata = &acp_quirk_data,
412 		.fw_filename = "sof-acp_6_3.ri",
413 		.sof_tplg_filename = "sof-acp_6_3.tplg",
414 	},
415 	{},
416 };
417 EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sof_machines);
418 
419 struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_sof_machines[] = {
420 	{
421 		.id = "AMDI1010",
422 		.drv_name = "acp70-dsp",
423 		.pdata = &acp_quirk_data,
424 		.fw_filename = "sof-acp_7_0.ri",
425 		.sof_tplg_filename = "sof-acp_7_0.tplg",
426 	},
427 	{},
428 };
429 EXPORT_SYMBOL(snd_soc_acpi_amd_acp70_sof_machines);
430 
431 struct snd_soc_acpi_mach snd_soc_acpi_amd_acp7x_sof_machines[] = {
432 	{
433 		.id = "AMDI1010",
434 		.drv_name = "acp7x-dsp",
435 		.pdata = &acp_quirk_data,
436 		.fw_filename = "sof-acp7x.ri",
437 		.sof_tplg_filename = "sof-acp7x.tplg",
438 	},
439 	{},
440 };
441 EXPORT_SYMBOL(snd_soc_acpi_amd_acp7x_sof_machines);
442 
443 MODULE_DESCRIPTION("AMD ACP Machine Configuration Module");
444 MODULE_LICENSE("Dual BSD/GPL");
445