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
snd_amd_acp_acpi_find_config(struct pci_dev * pci)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
snd_amd_acp_find_config(struct pci_dev * pci)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 = &_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 = &_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 = &_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 = &_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 = &_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 = &_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 = &_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