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), "acp-audio-config-flag",
170				   ACPI_TYPE_INTEGER, &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(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