linux/drivers/acpi/blacklist.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   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.
   7 *  Check given machine against acpi_rev_dmi_table[].
   8 *
   9 *  Copyright (C) 2004 Len Brown <len.brown@intel.com>
  10 *  Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
  11 */
  12
  13#include <linux/kernel.h>
  14#include <linux/init.h>
  15#include <linux/acpi.h>
  16#include <linux/dmi.h>
  17
  18#include "internal.h"
  19
  20#ifdef CONFIG_DMI
  21static const struct dmi_system_id acpi_rev_dmi_table[] __initconst;
  22#endif
  23
  24/*
  25 * POLICY: If *anything* doesn't work, put it on the blacklist.
  26 *         If they are critical errors, mark it critical, and abort driver load.
  27 */
  28static struct acpi_platform_list acpi_blacklist[] __initdata = {
  29        /* Compaq Presario 1700 */
  30        {"PTLTD ", "  DSDT  ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal,
  31         "Multiple problems", 1},
  32        /* Sony FX120, FX140, FX150? */
  33        {"SONY  ", "U0      ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal,
  34         "ACPI driver problem", 1},
  35        /* Compaq Presario 800, Insyde BIOS */
  36        {"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_DSDT, less_than_or_equal,
  37         "Does not use _REG to protect EC OpRegions", 1},
  38        /* IBM 600E - _ADR should return 7, but it returns 1 */
  39        {"IBM   ", "TP600E  ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
  40         "Incorrect _ADR", 1},
  41
  42        { }
  43};
  44
  45int __init acpi_blacklisted(void)
  46{
  47        int i;
  48        int blacklisted = 0;
  49
  50        i = acpi_match_platform_list(acpi_blacklist);
  51        if (i >= 0) {
  52                pr_err(PREFIX "Vendor \"%6.6s\" System \"%8.8s\" Revision 0x%x has a known ACPI BIOS problem.\n",
  53                       acpi_blacklist[i].oem_id,
  54                       acpi_blacklist[i].oem_table_id,
  55                       acpi_blacklist[i].oem_revision);
  56
  57                pr_err(PREFIX "Reason: %s. This is a %s error\n",
  58                       acpi_blacklist[i].reason,
  59                       (acpi_blacklist[i].data ?
  60                        "non-recoverable" : "recoverable"));
  61
  62                blacklisted = acpi_blacklist[i].data;
  63        }
  64
  65        (void)early_acpi_osi_init();
  66#ifdef CONFIG_DMI
  67        dmi_check_system(acpi_rev_dmi_table);
  68#endif
  69
  70        return blacklisted;
  71}
  72#ifdef CONFIG_DMI
  73#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
  74static int __init dmi_enable_rev_override(const struct dmi_system_id *d)
  75{
  76        printk(KERN_NOTICE PREFIX "DMI detected: %s (force ACPI _REV to 5)\n",
  77               d->ident);
  78        acpi_rev_override_setup(NULL);
  79        return 0;
  80}
  81#endif
  82
  83static const struct dmi_system_id acpi_rev_dmi_table[] __initconst = {
  84#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
  85        /*
  86         * DELL XPS 13 (2015) switches sound between HDA and I2S
  87         * depending on the ACPI _REV callback. If userspace supports
  88         * I2S sufficiently (or if you do not care about sound), you
  89         * can safely disable this quirk.
  90         */
  91        {
  92         .callback = dmi_enable_rev_override,
  93         .ident = "DELL XPS 13 (2015)",
  94         .matches = {
  95                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  96                      DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343"),
  97                },
  98        },
  99        {
 100         .callback = dmi_enable_rev_override,
 101         .ident = "DELL Precision 5520",
 102         .matches = {
 103                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 104                      DMI_MATCH(DMI_PRODUCT_NAME, "Precision 5520"),
 105                },
 106        },
 107        {
 108         .callback = dmi_enable_rev_override,
 109         .ident = "DELL Precision 3520",
 110         .matches = {
 111                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 112                      DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3520"),
 113                },
 114        },
 115        /*
 116         * Resolves a quirk with the Dell Latitude 3350 that
 117         * causes the ethernet adapter to not function.
 118         */
 119        {
 120         .callback = dmi_enable_rev_override,
 121         .ident = "DELL Latitude 3350",
 122         .matches = {
 123                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 124                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 3350"),
 125                },
 126        },
 127        {
 128         .callback = dmi_enable_rev_override,
 129         .ident = "DELL Inspiron 7537",
 130         .matches = {
 131                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 132                      DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7537"),
 133                },
 134        },
 135#endif
 136        {}
 137};
 138
 139#endif /* CONFIG_DMI */
 140