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 = &_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 = &_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 = &_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 = &_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 = &_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 = &_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 = &_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