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