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
24static int acp_quirk_data;
25
26static const struct config_entry config_table[] = {
27 {
28 .flags = FLAG_AMD_SOF,
29 .device = ACP_PCI_DEV_ID,
30 .dmi_table = (const struct dmi_system_id []) {
31 {
32 .matches = {
33 DMI_MATCH(DMI_SYS_VENDOR, "AMD"),
34 DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"),
35 },
36 },
37 {}
38 },
39 },
40 {
41 .flags = FLAG_AMD_SOF,
42 .device = ACP_PCI_DEV_ID,
43 .dmi_table = (const struct dmi_system_id []) {
44 {
45 .matches = {
46 DMI_MATCH(DMI_SYS_VENDOR, "Google"),
47 },
48 },
49 {}
50 },
51 },
52 {
53 .flags = FLAG_AMD_LEGACY,
54 .device = ACP_PCI_DEV_ID,
55 .dmi_table = (const struct dmi_system_id []) {
56 {
57 .matches = {
58 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
59 DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"),
60 },
61 },
62 {}
63 },
64 },
65 {
66 .flags = FLAG_AMD_SOF,
67 .device = ACP_PCI_DEV_ID,
68 .dmi_table = (const struct dmi_system_id []) {
69 {
70 .matches = {
71 DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
72 DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
73 },
74 },
75 {}
76 },
77 },
78 {
79 .flags = FLAG_AMD_LEGACY,
80 .device = ACP_PCI_DEV_ID,
81 .dmi_table = (const struct dmi_system_id []) {
82 {
83 .matches = {
84 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
85 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"),
86 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
87 },
88 },
89 {}
90 },
91 },
92 {
93 .flags = FLAG_AMD_LEGACY,
94 .device = ACP_PCI_DEV_ID,
95 .dmi_table = (const struct dmi_system_id []) {
96 {
97 .matches = {
98 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
99 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"),
100 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
101 },
102 },
103 {}
104 },
105 },
106 {
107 .flags = FLAG_AMD_LEGACY,
108 .device = ACP_PCI_DEV_ID,
109 .dmi_table = (const struct dmi_system_id []) {
110 {
111 .matches = {
112 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
113 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"),
114 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
115 },
116 },
117 {}
118 },
119 },
120 {
121 .flags = FLAG_AMD_LEGACY,
122 .device = ACP_PCI_DEV_ID,
123 .dmi_table = (const struct dmi_system_id []) {
124 {
125 .matches = {
126 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
127 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
128 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"),
129 },
130 },
131 {}
132 },
133 },
134 {
135 .flags = FLAG_AMD_LEGACY,
136 .device = ACP_PCI_DEV_ID,
137 .dmi_table = (const struct dmi_system_id []) {
138 {
139 .matches = {
140 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
141 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
142 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"),
143 },
144 },
145 {}
146 },
147 },
148 {
149 .flags = FLAG_AMD_LEGACY,
150 .device = ACP_PCI_DEV_ID,
151 .dmi_table = (const struct dmi_system_id []) {
152 {
153 .matches = {
154 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"),
155 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"),
156 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"),
157 },
158 },
159 {}
160 },
161 },
162};
163
164static int snd_amd_acp_acpi_find_config(struct pci_dev *pci)
165{
166 const union acpi_object *obj;
167 int acp_flag = FLAG_AMD_LEGACY_ONLY_DMIC;
168
169 if (!acpi_dev_get_property(ACPI_COMPANION(&pci->dev), name: "acp-audio-config-flag",
170 ACPI_TYPE_INTEGER, obj: &obj))
171 acp_flag = obj->integer.value;
172
173 return acp_flag;
174}
175
176int snd_amd_acp_find_config(struct pci_dev *pci)
177{
178 const struct config_entry *table = config_table;
179 u16 device = pci->device;
180 int i;
181
182 /* Do not enable FLAGS on older platforms with Rev Id zero
183 * For platforms which has ACP 7.0 or higher, read the acp
184 * config flag from BIOS ACPI table and for older platforms
185 * read it from DMI tables.
186 */
187 if (!pci->revision)
188 return 0;
189 else if (pci->revision >= ACP_7_0_REV)
190 return snd_amd_acp_acpi_find_config(pci);
191
192 for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {
193 if (table->device != device)
194 continue;
195 if (table->dmi_table && !dmi_check_system(list: table->dmi_table))
196 continue;
197 acp_quirk_data = table->flags;
198 return table->flags;
199 }
200
201 return 0;
202}
203EXPORT_SYMBOL(snd_amd_acp_find_config);
204
205static struct snd_soc_acpi_codecs amp_rt1019 = {
206 .num_codecs = 1,
207 .codecs = {"10EC1019"}
208};
209
210static struct snd_soc_acpi_codecs amp_max = {
211 .num_codecs = 1,
212 .codecs = {"MX98360A"}
213};
214
215static struct snd_soc_acpi_codecs amp_max98388 = {
216 .num_codecs = 1,
217 .codecs = {"ADS8388"}
218};
219
220struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = {
221 {
222 .id = "10EC5682",
223 .drv_name = "rt5682-rt1019",
224 .pdata = (void *)&acp_quirk_data,
225 .machine_quirk = snd_soc_acpi_codec_list,
226 .quirk_data = &amp_rt1019,
227 .fw_filename = "sof-rn.ri",
228 .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
229 },
230 {
231 .id = "10EC5682",
232 .drv_name = "rt5682-max",
233 .pdata = (void *)&acp_quirk_data,
234 .machine_quirk = snd_soc_acpi_codec_list,
235 .quirk_data = &amp_max,
236 .fw_filename = "sof-rn.ri",
237 .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
238 },
239 {
240 .id = "RTL5682",
241 .drv_name = "rt5682s-max",
242 .pdata = (void *)&acp_quirk_data,
243 .machine_quirk = snd_soc_acpi_codec_list,
244 .quirk_data = &amp_max,
245 .fw_filename = "sof-rn.ri",
246 .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
247 },
248 {
249 .id = "RTL5682",
250 .drv_name = "rt5682s-rt1019",
251 .pdata = (void *)&acp_quirk_data,
252 .machine_quirk = snd_soc_acpi_codec_list,
253 .quirk_data = &amp_rt1019,
254 .fw_filename = "sof-rn.ri",
255 .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
256 },
257 {
258 .id = "AMDI1019",
259 .drv_name = "renoir-dsp",
260 .pdata = (void *)&acp_quirk_data,
261 .fw_filename = "sof-rn.ri",
262 .sof_tplg_filename = "sof-acp.tplg",
263 },
264 {},
265};
266EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines);
267
268struct snd_soc_acpi_mach snd_soc_acpi_amd_vangogh_sof_machines[] = {
269 {
270 .id = "NVTN2020",
271 .drv_name = "nau8821-max",
272 .pdata = &acp_quirk_data,
273 .machine_quirk = snd_soc_acpi_codec_list,
274 .quirk_data = &amp_max98388,
275 .fw_filename = "sof-vangogh.ri",
276 .sof_tplg_filename = "sof-vangogh-nau8821-max.tplg",
277 },
278 {},
279};
280EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines);
281
282struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_sof_machines[] = {
283 {
284 .id = "AMDI1019",
285 .drv_name = "rmb-dsp",
286 .pdata = &acp_quirk_data,
287 .fw_filename = "sof-rmb.ri",
288 .sof_tplg_filename = "sof-acp-rmb.tplg",
289 },
290 {
291 .id = "10508825",
292 .drv_name = "nau8825-max",
293 .pdata = &acp_quirk_data,
294 .machine_quirk = snd_soc_acpi_codec_list,
295 .quirk_data = &amp_max,
296 .fw_filename = "sof-rmb.ri",
297 .sof_tplg_filename = "sof-rmb-nau8825-max98360.tplg",
298 },
299 {
300 .id = "RTL5682",
301 .drv_name = "rt5682s-hs-rt1019",
302 .pdata = &acp_quirk_data,
303 .machine_quirk = snd_soc_acpi_codec_list,
304 .quirk_data = &amp_rt1019,
305 .fw_filename = "sof-rmb.ri",
306 .sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg",
307 },
308 {},
309};
310EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines);
311
312struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sof_machines[] = {
313 {
314 .id = "AMDI1019",
315 .drv_name = "acp63-dsp",
316 .pdata = &acp_quirk_data,
317 .fw_filename = "sof-acp_6_3.ri",
318 .sof_tplg_filename = "sof-acp_6_3.tplg",
319 },
320 {},
321};
322EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sof_machines);
323
324MODULE_DESCRIPTION("AMD ACP Machine Configuration Module");
325MODULE_LICENSE("Dual BSD/GPL");
326

source code of linux/sound/soc/amd/acp-config.c