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 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 164 static 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 176 int 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 } 203 EXPORT_SYMBOL(snd_amd_acp_find_config); 204 205 static struct snd_soc_acpi_codecs amp_rt1019 = { 206 .num_codecs = 1, 207 .codecs = {"10EC1019"} 208 }; 209 210 static struct snd_soc_acpi_codecs amp_max = { 211 .num_codecs = 1, 212 .codecs = {"MX98360A"} 213 }; 214 215 static struct snd_soc_acpi_codecs amp_max98388 = { 216 .num_codecs = 1, 217 .codecs = {"ADS8388"} 218 }; 219 220 struct 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 = &_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 = &_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 = &_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 = &_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 }; 266 EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines); 267 268 struct 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 = &_max98388, 275 .fw_filename = "sof-vangogh.ri", 276 .sof_tplg_filename = "sof-vangogh-nau8821-max.tplg", 277 }, 278 {}, 279 }; 280 EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines); 281 282 struct 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 = &_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 = &_rt1019, 305 .fw_filename = "sof-rmb.ri", 306 .sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg", 307 }, 308 {}, 309 }; 310 EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines); 311 312 struct 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 }; 322 EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sof_machines); 323 324 MODULE_DESCRIPTION("AMD ACP Machine Configuration Module"); 325 MODULE_LICENSE("Dual BSD/GPL"); 326