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 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 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