blob: ad2c565f5cbe0686e86d51349689ef0f259b2417 [file] [log] [blame]
Thomas Gleixnerc942fdd2019-05-27 08:55:06 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * blacklist.c
4 *
5 * Check to see if the given machine has a known bad ACPI BIOS
6 * or if the BIOS is too old.
Lv Zhenge5f660e2016-05-03 16:49:01 +08007 * Check given machine against acpi_rev_dmi_table[].
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 *
9 * Copyright (C) 2004 Len Brown <len.brown@intel.com>
10 * Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 */
12
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014#include <linux/init.h>
15#include <linux/acpi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/dmi.h>
17
Len Browna192a952009-07-28 16:45:54 -040018#include "internal.h"
19
Christoph Hellwig6faadbb2017-09-14 11:59:30 +020020static const struct dmi_system_id acpi_rev_dmi_table[] __initconst;
Len Brownd4b7dc42008-01-23 20:50:56 -050021
Linus Torvalds1da177e2005-04-16 15:20:36 -070022/*
23 * POLICY: If *anything* doesn't work, put it on the blacklist.
24 * If they are critical errors, mark it critical, and abort driver load.
25 */
Toshi Kani5aa59112017-08-23 16:54:43 -060026static struct acpi_platform_list acpi_blacklist[] __initdata = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070027 /* Compaq Presario 1700 */
Alexey Starikovskiyad71860a2007-02-02 19:48:19 +030028 {"PTLTD ", " DSDT ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal,
Len Brown4be44fc2005-08-05 00:44:28 -040029 "Multiple problems", 1},
Linus Torvalds1da177e2005-04-16 15:20:36 -070030 /* Sony FX120, FX140, FX150? */
Alexey Starikovskiyad71860a2007-02-02 19:48:19 +030031 {"SONY ", "U0 ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal,
Len Brown4be44fc2005-08-05 00:44:28 -040032 "ACPI driver problem", 1},
Linus Torvalds1da177e2005-04-16 15:20:36 -070033 /* Compaq Presario 800, Insyde BIOS */
Alexey Starikovskiyad71860a2007-02-02 19:48:19 +030034 {"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_DSDT, less_than_or_equal,
Len Brown4be44fc2005-08-05 00:44:28 -040035 "Does not use _REG to protect EC OpRegions", 1},
Linus Torvalds1da177e2005-04-16 15:20:36 -070036 /* IBM 600E - _ADR should return 7, but it returns 1 */
Alexey Starikovskiyad71860a2007-02-02 19:48:19 +030037 {"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
Len Brown4be44fc2005-08-05 00:44:28 -040038 "Incorrect _ADR", 1},
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
Toshi Kani5aa59112017-08-23 16:54:43 -060040 { }
Linus Torvalds1da177e2005-04-16 15:20:36 -070041};
42
Len Brown4be44fc2005-08-05 00:44:28 -040043int __init acpi_blacklisted(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044{
Toshi Kani5aa59112017-08-23 16:54:43 -060045 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 int blacklisted = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Toshi Kani5aa59112017-08-23 16:54:43 -060048 i = acpi_match_platform_list(acpi_blacklist);
49 if (i >= 0) {
50 pr_err(PREFIX "Vendor \"%6.6s\" System \"%8.8s\" Revision 0x%x has a known ACPI BIOS problem.\n",
51 acpi_blacklist[i].oem_id,
52 acpi_blacklist[i].oem_table_id,
53 acpi_blacklist[i].oem_revision);
Linus Torvalds1da177e2005-04-16 15:20:36 -070054
Toshi Kani5aa59112017-08-23 16:54:43 -060055 pr_err(PREFIX "Reason: %s. This is a %s error\n",
56 acpi_blacklist[i].reason,
57 (acpi_blacklist[i].data ?
58 "non-recoverable" : "recoverable"));
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Toshi Kani5aa59112017-08-23 16:54:43 -060060 blacklisted = acpi_blacklist[i].data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070061 }
62
Lv Zhenge5f660e2016-05-03 16:49:01 +080063 (void)early_acpi_osi_init();
64 dmi_check_system(acpi_rev_dmi_table);
Len Brownd4b7dc42008-01-23 20:50:56 -050065
Linus Torvalds1da177e2005-04-16 15:20:36 -070066 return blacklisted;
67}
Len Brownd4b7dc42008-01-23 20:50:56 -050068#ifdef CONFIG_DMI
Rafael J. Wysocki18d78b62015-07-03 01:06:00 +020069#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
70static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
71{
72 printk(KERN_NOTICE PREFIX "DMI detected: %s (force ACPI _REV to 5)\n",
73 d->ident);
74 acpi_rev_override_setup(NULL);
75 return 0;
76}
77#endif
Len Browna1bd4e32008-01-23 21:19:27 -050078
Christoph Hellwig6faadbb2017-09-14 11:59:30 +020079static const struct dmi_system_id acpi_rev_dmi_table[] __initconst = {
Rafael J. Wysocki18d78b62015-07-03 01:06:00 +020080#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
81 /*
82 * DELL XPS 13 (2015) switches sound between HDA and I2S
83 * depending on the ACPI _REV callback. If userspace supports
84 * I2S sufficiently (or if you do not care about sound), you
85 * can safely disable this quirk.
86 */
87 {
88 .callback = dmi_enable_rev_override,
89 .ident = "DELL XPS 13 (2015)",
90 .matches = {
91 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
92 DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343"),
93 },
94 },
Alex Hung9523b9b2016-10-28 11:54:04 -070095 {
96 .callback = dmi_enable_rev_override,
97 .ident = "DELL Precision 5520",
98 .matches = {
99 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
100 DMI_MATCH(DMI_PRODUCT_NAME, "Precision 5520"),
101 },
102 },
103 {
104 .callback = dmi_enable_rev_override,
105 .ident = "DELL Precision 3520",
106 .matches = {
107 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
108 DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3520"),
109 },
110 },
Michael Pobega708f5dc2016-11-11 22:29:14 -0500111 /*
112 * Resolves a quirk with the Dell Latitude 3350 that
113 * causes the ethernet adapter to not function.
114 */
115 {
116 .callback = dmi_enable_rev_override,
117 .ident = "DELL Latitude 3350",
118 .matches = {
119 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
120 DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 3350"),
121 },
122 },
Kai Heng Feng2cff3192017-04-12 16:12:45 +0800123 {
124 .callback = dmi_enable_rev_override,
125 .ident = "DELL Inspiron 7537",
126 .matches = {
127 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
128 DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7537"),
129 },
130 },
Rafael J. Wysocki18d78b62015-07-03 01:06:00 +0200131#endif
Len Brownd4b7dc42008-01-23 20:50:56 -0500132 {}
133};
134
135#endif /* CONFIG_DMI */