1f1bdd8d3SAjit Kumar Pandey // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2f1bdd8d3SAjit Kumar Pandey // 3f1bdd8d3SAjit Kumar Pandey // This file is provided under a dual BSD/GPLv2 license. When using or 4f1bdd8d3SAjit Kumar Pandey // redistributing this file, you may do so under either license. 5f1bdd8d3SAjit Kumar Pandey // 6c3ab23a1SVenkata Prasad Potturu // Copyright(c) 2021, 2023 Advanced Micro Devices, Inc. 7f1bdd8d3SAjit Kumar Pandey // 8f1bdd8d3SAjit Kumar Pandey // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com> 9f1bdd8d3SAjit Kumar Pandey // 10f1bdd8d3SAjit Kumar Pandey 11f1bdd8d3SAjit Kumar Pandey /* ACP machine configuration module */ 12f1bdd8d3SAjit Kumar Pandey 13f1bdd8d3SAjit Kumar Pandey #include <linux/acpi.h> 14f1bdd8d3SAjit Kumar Pandey #include <linux/bits.h> 15f1bdd8d3SAjit Kumar Pandey #include <linux/dmi.h> 16f1bdd8d3SAjit Kumar Pandey #include <linux/module.h> 17f1bdd8d3SAjit Kumar Pandey #include <linux/pci.h> 18f1bdd8d3SAjit Kumar Pandey 19f1bdd8d3SAjit Kumar Pandey #include "../sof/amd/acp.h" 20f1bdd8d3SAjit Kumar Pandey #include "mach-config.h" 21f1bdd8d3SAjit Kumar Pandey 22*8527ecc6SVijendar Mukunda #define ACP_7_0_REV 0x70 23*8527ecc6SVijendar Mukunda 24f1bdd8d3SAjit Kumar Pandey static int acp_quirk_data; 25f1bdd8d3SAjit Kumar Pandey 26f1bdd8d3SAjit Kumar Pandey static const struct config_entry config_table[] = { 27f1bdd8d3SAjit Kumar Pandey { 28f1bdd8d3SAjit Kumar Pandey .flags = FLAG_AMD_SOF, 29f1bdd8d3SAjit Kumar Pandey .device = ACP_PCI_DEV_ID, 30f1bdd8d3SAjit Kumar Pandey .dmi_table = (const struct dmi_system_id []) { 31f1bdd8d3SAjit Kumar Pandey { 32f1bdd8d3SAjit Kumar Pandey .matches = { 33f1bdd8d3SAjit Kumar Pandey DMI_MATCH(DMI_SYS_VENDOR, "AMD"), 34f1bdd8d3SAjit Kumar Pandey DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"), 35f1bdd8d3SAjit Kumar Pandey }, 36f1bdd8d3SAjit Kumar Pandey }, 37f1bdd8d3SAjit Kumar Pandey {} 38f1bdd8d3SAjit Kumar Pandey }, 39f1bdd8d3SAjit Kumar Pandey }, 40f4872013SAjit Kumar Pandey { 41f4872013SAjit Kumar Pandey .flags = FLAG_AMD_SOF, 42f4872013SAjit Kumar Pandey .device = ACP_PCI_DEV_ID, 43f4872013SAjit Kumar Pandey .dmi_table = (const struct dmi_system_id []) { 44f4872013SAjit Kumar Pandey { 45f4872013SAjit Kumar Pandey .matches = { 46f4872013SAjit Kumar Pandey DMI_MATCH(DMI_SYS_VENDOR, "Google"), 47f4872013SAjit Kumar Pandey }, 48f4872013SAjit Kumar Pandey }, 49f4872013SAjit Kumar Pandey {} 50f4872013SAjit Kumar Pandey }, 51f4872013SAjit Kumar Pandey }, 52197b1f7fSVenkata Prasad Potturu { 53c3ab23a1SVenkata Prasad Potturu .flags = FLAG_AMD_LEGACY, 54c3ab23a1SVenkata Prasad Potturu .device = ACP_PCI_DEV_ID, 55c3ab23a1SVenkata Prasad Potturu .dmi_table = (const struct dmi_system_id []) { 56c3ab23a1SVenkata Prasad Potturu { 57c3ab23a1SVenkata Prasad Potturu .matches = { 58c3ab23a1SVenkata Prasad Potturu DMI_MATCH(DMI_SYS_VENDOR, "Valve"), 59c3ab23a1SVenkata Prasad Potturu DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"), 60c3ab23a1SVenkata Prasad Potturu }, 61c3ab23a1SVenkata Prasad Potturu }, 62c3ab23a1SVenkata Prasad Potturu {} 63c3ab23a1SVenkata Prasad Potturu }, 64c3ab23a1SVenkata Prasad Potturu }, 65c3ab23a1SVenkata Prasad Potturu { 66197b1f7fSVenkata Prasad Potturu .flags = FLAG_AMD_SOF, 67197b1f7fSVenkata Prasad Potturu .device = ACP_PCI_DEV_ID, 68197b1f7fSVenkata Prasad Potturu .dmi_table = (const struct dmi_system_id []) { 69197b1f7fSVenkata Prasad Potturu { 70197b1f7fSVenkata Prasad Potturu .matches = { 71197b1f7fSVenkata Prasad Potturu DMI_MATCH(DMI_SYS_VENDOR, "Valve"), 72197b1f7fSVenkata Prasad Potturu DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"), 73197b1f7fSVenkata Prasad Potturu }, 74197b1f7fSVenkata Prasad Potturu }, 75197b1f7fSVenkata Prasad Potturu {} 76197b1f7fSVenkata Prasad Potturu }, 77197b1f7fSVenkata Prasad Potturu }, 7854fcd9ddSMarian Postevca { 7954fcd9ddSMarian Postevca .flags = FLAG_AMD_LEGACY, 8054fcd9ddSMarian Postevca .device = ACP_PCI_DEV_ID, 8154fcd9ddSMarian Postevca .dmi_table = (const struct dmi_system_id []) { 8254fcd9ddSMarian Postevca { 8354fcd9ddSMarian Postevca .matches = { 8454fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"), 8554fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXXW"), 8654fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"), 8754fcd9ddSMarian Postevca }, 8854fcd9ddSMarian Postevca }, 8954fcd9ddSMarian Postevca {} 9054fcd9ddSMarian Postevca }, 9154fcd9ddSMarian Postevca }, 9254fcd9ddSMarian Postevca { 9354fcd9ddSMarian Postevca .flags = FLAG_AMD_LEGACY, 9454fcd9ddSMarian Postevca .device = ACP_PCI_DEV_ID, 9554fcd9ddSMarian Postevca .dmi_table = (const struct dmi_system_id []) { 9654fcd9ddSMarian Postevca { 9754fcd9ddSMarian Postevca .matches = { 9854fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"), 9954fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "KLVL-WXX9"), 10054fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"), 10154fcd9ddSMarian Postevca }, 10254fcd9ddSMarian Postevca }, 10354fcd9ddSMarian Postevca {} 10454fcd9ddSMarian Postevca }, 10554fcd9ddSMarian Postevca }, 10654fcd9ddSMarian Postevca { 10754fcd9ddSMarian Postevca .flags = FLAG_AMD_LEGACY, 10854fcd9ddSMarian Postevca .device = ACP_PCI_DEV_ID, 10954fcd9ddSMarian Postevca .dmi_table = (const struct dmi_system_id []) { 11054fcd9ddSMarian Postevca { 11154fcd9ddSMarian Postevca .matches = { 11254fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"), 11354fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BOM-WXX9"), 11454fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1010"), 11554fcd9ddSMarian Postevca }, 11654fcd9ddSMarian Postevca }, 11754fcd9ddSMarian Postevca {} 11854fcd9ddSMarian Postevca }, 11954fcd9ddSMarian Postevca }, 12054fcd9ddSMarian Postevca { 12154fcd9ddSMarian Postevca .flags = FLAG_AMD_LEGACY, 12254fcd9ddSMarian Postevca .device = ACP_PCI_DEV_ID, 12354fcd9ddSMarian Postevca .dmi_table = (const struct dmi_system_id []) { 12454fcd9ddSMarian Postevca { 12554fcd9ddSMarian Postevca .matches = { 12654fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"), 12754fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"), 12854fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1020"), 12954fcd9ddSMarian Postevca }, 13054fcd9ddSMarian Postevca }, 13154fcd9ddSMarian Postevca {} 13254fcd9ddSMarian Postevca }, 13354fcd9ddSMarian Postevca }, 13454fcd9ddSMarian Postevca { 13554fcd9ddSMarian Postevca .flags = FLAG_AMD_LEGACY, 13654fcd9ddSMarian Postevca .device = ACP_PCI_DEV_ID, 13754fcd9ddSMarian Postevca .dmi_table = (const struct dmi_system_id []) { 13854fcd9ddSMarian Postevca { 13954fcd9ddSMarian Postevca .matches = { 14054fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "HUAWEI"), 14154fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HVY-WXX9"), 14254fcd9ddSMarian Postevca DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "M1040"), 14354fcd9ddSMarian Postevca }, 14454fcd9ddSMarian Postevca }, 14554fcd9ddSMarian Postevca {} 14654fcd9ddSMarian Postevca }, 14754fcd9ddSMarian Postevca }, 148f1bdd8d3SAjit Kumar Pandey }; 149f1bdd8d3SAjit Kumar Pandey 150*8527ecc6SVijendar Mukunda static int snd_amd_acp_acpi_find_config(struct pci_dev *pci) 151*8527ecc6SVijendar Mukunda { 152*8527ecc6SVijendar Mukunda const union acpi_object *obj; 153*8527ecc6SVijendar Mukunda int acp_flag = FLAG_AMD_LEGACY_ONLY_DMIC; 154*8527ecc6SVijendar Mukunda 155*8527ecc6SVijendar Mukunda if (!acpi_dev_get_property(ACPI_COMPANION(&pci->dev), "acp-audio-config-flag", 156*8527ecc6SVijendar Mukunda ACPI_TYPE_INTEGER, &obj)) 157*8527ecc6SVijendar Mukunda acp_flag = obj->integer.value; 158*8527ecc6SVijendar Mukunda 159*8527ecc6SVijendar Mukunda return acp_flag; 160*8527ecc6SVijendar Mukunda } 161*8527ecc6SVijendar Mukunda 162f1bdd8d3SAjit Kumar Pandey int snd_amd_acp_find_config(struct pci_dev *pci) 163f1bdd8d3SAjit Kumar Pandey { 164f1bdd8d3SAjit Kumar Pandey const struct config_entry *table = config_table; 165f1bdd8d3SAjit Kumar Pandey u16 device = pci->device; 166f1bdd8d3SAjit Kumar Pandey int i; 167f1bdd8d3SAjit Kumar Pandey 168*8527ecc6SVijendar Mukunda /* Do not enable FLAGS on older platforms with Rev Id zero 169*8527ecc6SVijendar Mukunda * For platforms which has ACP 7.0 or higher, read the acp 170*8527ecc6SVijendar Mukunda * config flag from BIOS ACPI table and for older platforms 171*8527ecc6SVijendar Mukunda * read it from DMI tables. 172*8527ecc6SVijendar Mukunda */ 173f4872013SAjit Kumar Pandey if (!pci->revision) 174f4872013SAjit Kumar Pandey return 0; 175*8527ecc6SVijendar Mukunda else if (pci->revision >= ACP_7_0_REV) 176*8527ecc6SVijendar Mukunda return snd_amd_acp_acpi_find_config(pci); 177f4872013SAjit Kumar Pandey 178f1bdd8d3SAjit Kumar Pandey for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) { 179f1bdd8d3SAjit Kumar Pandey if (table->device != device) 180f1bdd8d3SAjit Kumar Pandey continue; 181f1bdd8d3SAjit Kumar Pandey if (table->dmi_table && !dmi_check_system(table->dmi_table)) 182f1bdd8d3SAjit Kumar Pandey continue; 183f1bdd8d3SAjit Kumar Pandey acp_quirk_data = table->flags; 184f1bdd8d3SAjit Kumar Pandey return table->flags; 185f1bdd8d3SAjit Kumar Pandey } 186f1bdd8d3SAjit Kumar Pandey 187f1bdd8d3SAjit Kumar Pandey return 0; 188f1bdd8d3SAjit Kumar Pandey } 189f1bdd8d3SAjit Kumar Pandey EXPORT_SYMBOL(snd_amd_acp_find_config); 190f1bdd8d3SAjit Kumar Pandey 191f4872013SAjit Kumar Pandey static struct snd_soc_acpi_codecs amp_rt1019 = { 192f4872013SAjit Kumar Pandey .num_codecs = 1, 193f4872013SAjit Kumar Pandey .codecs = {"10EC1019"} 194f4872013SAjit Kumar Pandey }; 195f4872013SAjit Kumar Pandey 196f4872013SAjit Kumar Pandey static struct snd_soc_acpi_codecs amp_max = { 197f4872013SAjit Kumar Pandey .num_codecs = 1, 198f4872013SAjit Kumar Pandey .codecs = {"MX98360A"} 199f4872013SAjit Kumar Pandey }; 200f4872013SAjit Kumar Pandey 201ef51cddfSVenkata Prasad Potturu static struct snd_soc_acpi_codecs amp_max98388 = { 202ef51cddfSVenkata Prasad Potturu .num_codecs = 1, 203ef51cddfSVenkata Prasad Potturu .codecs = {"ADS8388"} 204ef51cddfSVenkata Prasad Potturu }; 205ef51cddfSVenkata Prasad Potturu 206f1bdd8d3SAjit Kumar Pandey struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = { 207f1bdd8d3SAjit Kumar Pandey { 208f4872013SAjit Kumar Pandey .id = "10EC5682", 209f4872013SAjit Kumar Pandey .drv_name = "rt5682-rt1019", 210f4872013SAjit Kumar Pandey .pdata = (void *)&acp_quirk_data, 211f4872013SAjit Kumar Pandey .machine_quirk = snd_soc_acpi_codec_list, 212f4872013SAjit Kumar Pandey .quirk_data = &_rt1019, 213f4872013SAjit Kumar Pandey .fw_filename = "sof-rn.ri", 2140082e329SAjit Kumar Pandey .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg", 215f4872013SAjit Kumar Pandey }, 216f4872013SAjit Kumar Pandey { 217f4872013SAjit Kumar Pandey .id = "10EC5682", 218f4872013SAjit Kumar Pandey .drv_name = "rt5682-max", 219f4872013SAjit Kumar Pandey .pdata = (void *)&acp_quirk_data, 220f4872013SAjit Kumar Pandey .machine_quirk = snd_soc_acpi_codec_list, 221f4872013SAjit Kumar Pandey .quirk_data = &_max, 222f4872013SAjit Kumar Pandey .fw_filename = "sof-rn.ri", 2230082e329SAjit Kumar Pandey .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg", 224f4872013SAjit Kumar Pandey }, 225f4872013SAjit Kumar Pandey { 226f4872013SAjit Kumar Pandey .id = "RTL5682", 227f4872013SAjit Kumar Pandey .drv_name = "rt5682s-max", 228f4872013SAjit Kumar Pandey .pdata = (void *)&acp_quirk_data, 229f4872013SAjit Kumar Pandey .machine_quirk = snd_soc_acpi_codec_list, 230f4872013SAjit Kumar Pandey .quirk_data = &_max, 231f4872013SAjit Kumar Pandey .fw_filename = "sof-rn.ri", 2320082e329SAjit Kumar Pandey .sof_tplg_filename = "sof-rn-rt5682-max98360.tplg", 233f4872013SAjit Kumar Pandey }, 234f4872013SAjit Kumar Pandey { 235330dc183SV sujith kumar Reddy .id = "RTL5682", 236330dc183SV sujith kumar Reddy .drv_name = "rt5682s-rt1019", 237330dc183SV sujith kumar Reddy .pdata = (void *)&acp_quirk_data, 238330dc183SV sujith kumar Reddy .machine_quirk = snd_soc_acpi_codec_list, 239330dc183SV sujith kumar Reddy .quirk_data = &_rt1019, 240330dc183SV sujith kumar Reddy .fw_filename = "sof-rn.ri", 241330dc183SV sujith kumar Reddy .sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg", 242330dc183SV sujith kumar Reddy }, 243330dc183SV sujith kumar Reddy { 244f1bdd8d3SAjit Kumar Pandey .id = "AMDI1019", 245f1bdd8d3SAjit Kumar Pandey .drv_name = "renoir-dsp", 246f1bdd8d3SAjit Kumar Pandey .pdata = (void *)&acp_quirk_data, 247f1bdd8d3SAjit Kumar Pandey .fw_filename = "sof-rn.ri", 248f1bdd8d3SAjit Kumar Pandey .sof_tplg_filename = "sof-acp.tplg", 249f1bdd8d3SAjit Kumar Pandey }, 250f1bdd8d3SAjit Kumar Pandey {}, 251f1bdd8d3SAjit Kumar Pandey }; 252f1bdd8d3SAjit Kumar Pandey EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines); 253f1bdd8d3SAjit Kumar Pandey 254ef51cddfSVenkata Prasad Potturu struct snd_soc_acpi_mach snd_soc_acpi_amd_vangogh_sof_machines[] = { 255ef51cddfSVenkata Prasad Potturu { 256ef51cddfSVenkata Prasad Potturu .id = "NVTN2020", 257ef51cddfSVenkata Prasad Potturu .drv_name = "nau8821-max", 258ef51cddfSVenkata Prasad Potturu .pdata = &acp_quirk_data, 259ef51cddfSVenkata Prasad Potturu .machine_quirk = snd_soc_acpi_codec_list, 260ef51cddfSVenkata Prasad Potturu .quirk_data = &_max98388, 261ef51cddfSVenkata Prasad Potturu .fw_filename = "sof-vangogh.ri", 262ef51cddfSVenkata Prasad Potturu .sof_tplg_filename = "sof-vangogh-nau8821-max.tplg", 263ef51cddfSVenkata Prasad Potturu }, 264ef51cddfSVenkata Prasad Potturu {}, 265ef51cddfSVenkata Prasad Potturu }; 266ef51cddfSVenkata Prasad Potturu EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines); 267ef51cddfSVenkata Prasad Potturu 2680439eb4dSV sujith kumar Reddy struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_sof_machines[] = { 2690439eb4dSV sujith kumar Reddy { 2700439eb4dSV sujith kumar Reddy .id = "AMDI1019", 2710439eb4dSV sujith kumar Reddy .drv_name = "rmb-dsp", 2720439eb4dSV sujith kumar Reddy .pdata = &acp_quirk_data, 2730439eb4dSV sujith kumar Reddy .fw_filename = "sof-rmb.ri", 2740439eb4dSV sujith kumar Reddy .sof_tplg_filename = "sof-acp-rmb.tplg", 2750439eb4dSV sujith kumar Reddy }, 2760439eb4dSV sujith kumar Reddy { 2770439eb4dSV sujith kumar Reddy .id = "10508825", 2780439eb4dSV sujith kumar Reddy .drv_name = "nau8825-max", 2790439eb4dSV sujith kumar Reddy .pdata = &acp_quirk_data, 2800439eb4dSV sujith kumar Reddy .machine_quirk = snd_soc_acpi_codec_list, 2810439eb4dSV sujith kumar Reddy .quirk_data = &_max, 2820439eb4dSV sujith kumar Reddy .fw_filename = "sof-rmb.ri", 2830439eb4dSV sujith kumar Reddy .sof_tplg_filename = "sof-rmb-nau8825-max98360.tplg", 2840439eb4dSV sujith kumar Reddy }, 2854dc6737cSV sujith kumar Reddy { 2864dc6737cSV sujith kumar Reddy .id = "RTL5682", 2874dc6737cSV sujith kumar Reddy .drv_name = "rt5682s-hs-rt1019", 2884dc6737cSV sujith kumar Reddy .pdata = &acp_quirk_data, 2894dc6737cSV sujith kumar Reddy .machine_quirk = snd_soc_acpi_codec_list, 2904dc6737cSV sujith kumar Reddy .quirk_data = &_rt1019, 2914dc6737cSV sujith kumar Reddy .fw_filename = "sof-rmb.ri", 2924dc6737cSV sujith kumar Reddy .sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg", 2934dc6737cSV sujith kumar Reddy }, 2940439eb4dSV sujith kumar Reddy {}, 2950439eb4dSV sujith kumar Reddy }; 2960439eb4dSV sujith kumar Reddy EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines); 2970439eb4dSV sujith kumar Reddy 298bb98b592SVijendar Mukunda struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sof_machines[] = { 299bb98b592SVijendar Mukunda { 300bb98b592SVijendar Mukunda .id = "AMDI1019", 301bb98b592SVijendar Mukunda .drv_name = "acp63-dsp", 302bb98b592SVijendar Mukunda .pdata = &acp_quirk_data, 303bb98b592SVijendar Mukunda .fw_filename = "sof-acp_6_3.ri", 304bb98b592SVijendar Mukunda .sof_tplg_filename = "sof-acp_6_3.tplg", 305bb98b592SVijendar Mukunda }, 306bb98b592SVijendar Mukunda {}, 307bb98b592SVijendar Mukunda }; 308bb98b592SVijendar Mukunda EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sof_machines); 309bb98b592SVijendar Mukunda 310f1bdd8d3SAjit Kumar Pandey MODULE_LICENSE("Dual BSD/GPL"); 311