18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * blacklist.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Check to see if the given machine has a known bad ACPI BIOS 68c2ecf20Sopenharmony_ci * or if the BIOS is too old. 78c2ecf20Sopenharmony_ci * Check given machine against acpi_rev_dmi_table[]. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Copyright (C) 2004 Len Brown <len.brown@intel.com> 108c2ecf20Sopenharmony_ci * Copyright (C) 2002 Andy Grover <andrew.grover@intel.com> 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/kernel.h> 148c2ecf20Sopenharmony_ci#include <linux/init.h> 158c2ecf20Sopenharmony_ci#include <linux/acpi.h> 168c2ecf20Sopenharmony_ci#include <linux/dmi.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include "internal.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#ifdef CONFIG_DMI 218c2ecf20Sopenharmony_cistatic const struct dmi_system_id acpi_rev_dmi_table[] __initconst; 228c2ecf20Sopenharmony_ci#endif 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* 258c2ecf20Sopenharmony_ci * POLICY: If *anything* doesn't work, put it on the blacklist. 268c2ecf20Sopenharmony_ci * If they are critical errors, mark it critical, and abort driver load. 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_cistatic struct acpi_platform_list acpi_blacklist[] __initdata = { 298c2ecf20Sopenharmony_ci /* Compaq Presario 1700 */ 308c2ecf20Sopenharmony_ci {"PTLTD ", " DSDT ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal, 318c2ecf20Sopenharmony_ci "Multiple problems", 1}, 328c2ecf20Sopenharmony_ci /* Sony FX120, FX140, FX150? */ 338c2ecf20Sopenharmony_ci {"SONY ", "U0 ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal, 348c2ecf20Sopenharmony_ci "ACPI driver problem", 1}, 358c2ecf20Sopenharmony_ci /* Compaq Presario 800, Insyde BIOS */ 368c2ecf20Sopenharmony_ci {"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_DSDT, less_than_or_equal, 378c2ecf20Sopenharmony_ci "Does not use _REG to protect EC OpRegions", 1}, 388c2ecf20Sopenharmony_ci /* IBM 600E - _ADR should return 7, but it returns 1 */ 398c2ecf20Sopenharmony_ci {"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal, 408c2ecf20Sopenharmony_ci "Incorrect _ADR", 1}, 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci { } 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciint __init acpi_blacklisted(void) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci int i; 488c2ecf20Sopenharmony_ci int blacklisted = 0; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci i = acpi_match_platform_list(acpi_blacklist); 518c2ecf20Sopenharmony_ci if (i >= 0) { 528c2ecf20Sopenharmony_ci pr_err(PREFIX "Vendor \"%6.6s\" System \"%8.8s\" Revision 0x%x has a known ACPI BIOS problem.\n", 538c2ecf20Sopenharmony_ci acpi_blacklist[i].oem_id, 548c2ecf20Sopenharmony_ci acpi_blacklist[i].oem_table_id, 558c2ecf20Sopenharmony_ci acpi_blacklist[i].oem_revision); 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci pr_err(PREFIX "Reason: %s. This is a %s error\n", 588c2ecf20Sopenharmony_ci acpi_blacklist[i].reason, 598c2ecf20Sopenharmony_ci (acpi_blacklist[i].data ? 608c2ecf20Sopenharmony_ci "non-recoverable" : "recoverable")); 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci blacklisted = acpi_blacklist[i].data; 638c2ecf20Sopenharmony_ci } 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci (void)early_acpi_osi_init(); 668c2ecf20Sopenharmony_ci#ifdef CONFIG_DMI 678c2ecf20Sopenharmony_ci dmi_check_system(acpi_rev_dmi_table); 688c2ecf20Sopenharmony_ci#endif 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci return blacklisted; 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci#ifdef CONFIG_DMI 738c2ecf20Sopenharmony_ci#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE 748c2ecf20Sopenharmony_cistatic int __init dmi_enable_rev_override(const struct dmi_system_id *d) 758c2ecf20Sopenharmony_ci{ 768c2ecf20Sopenharmony_ci printk(KERN_NOTICE PREFIX "DMI detected: %s (force ACPI _REV to 5)\n", 778c2ecf20Sopenharmony_ci d->ident); 788c2ecf20Sopenharmony_ci acpi_rev_override_setup(NULL); 798c2ecf20Sopenharmony_ci return 0; 808c2ecf20Sopenharmony_ci} 818c2ecf20Sopenharmony_ci#endif 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic const struct dmi_system_id acpi_rev_dmi_table[] __initconst = { 848c2ecf20Sopenharmony_ci#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE 858c2ecf20Sopenharmony_ci /* 868c2ecf20Sopenharmony_ci * DELL XPS 13 (2015) switches sound between HDA and I2S 878c2ecf20Sopenharmony_ci * depending on the ACPI _REV callback. If userspace supports 888c2ecf20Sopenharmony_ci * I2S sufficiently (or if you do not care about sound), you 898c2ecf20Sopenharmony_ci * can safely disable this quirk. 908c2ecf20Sopenharmony_ci */ 918c2ecf20Sopenharmony_ci { 928c2ecf20Sopenharmony_ci .callback = dmi_enable_rev_override, 938c2ecf20Sopenharmony_ci .ident = "DELL XPS 13 (2015)", 948c2ecf20Sopenharmony_ci .matches = { 958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343"), 978c2ecf20Sopenharmony_ci }, 988c2ecf20Sopenharmony_ci }, 998c2ecf20Sopenharmony_ci { 1008c2ecf20Sopenharmony_ci .callback = dmi_enable_rev_override, 1018c2ecf20Sopenharmony_ci .ident = "DELL Precision 5520", 1028c2ecf20Sopenharmony_ci .matches = { 1038c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 1048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Precision 5520"), 1058c2ecf20Sopenharmony_ci }, 1068c2ecf20Sopenharmony_ci }, 1078c2ecf20Sopenharmony_ci { 1088c2ecf20Sopenharmony_ci .callback = dmi_enable_rev_override, 1098c2ecf20Sopenharmony_ci .ident = "DELL Precision 3520", 1108c2ecf20Sopenharmony_ci .matches = { 1118c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 1128c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3520"), 1138c2ecf20Sopenharmony_ci }, 1148c2ecf20Sopenharmony_ci }, 1158c2ecf20Sopenharmony_ci /* 1168c2ecf20Sopenharmony_ci * Resolves a quirk with the Dell Latitude 3350 that 1178c2ecf20Sopenharmony_ci * causes the ethernet adapter to not function. 1188c2ecf20Sopenharmony_ci */ 1198c2ecf20Sopenharmony_ci { 1208c2ecf20Sopenharmony_ci .callback = dmi_enable_rev_override, 1218c2ecf20Sopenharmony_ci .ident = "DELL Latitude 3350", 1228c2ecf20Sopenharmony_ci .matches = { 1238c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 1248c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 3350"), 1258c2ecf20Sopenharmony_ci }, 1268c2ecf20Sopenharmony_ci }, 1278c2ecf20Sopenharmony_ci { 1288c2ecf20Sopenharmony_ci .callback = dmi_enable_rev_override, 1298c2ecf20Sopenharmony_ci .ident = "DELL Inspiron 7537", 1308c2ecf20Sopenharmony_ci .matches = { 1318c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 1328c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7537"), 1338c2ecf20Sopenharmony_ci }, 1348c2ecf20Sopenharmony_ci }, 1358c2ecf20Sopenharmony_ci#endif 1368c2ecf20Sopenharmony_ci {} 1378c2ecf20Sopenharmony_ci}; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci#endif /* CONFIG_DMI */ 140