Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.14-rc2 179 lines 4.7 kB view raw
1/* 2 * blacklist.c 3 * 4 * Check to see if the given machine has a known bad ACPI BIOS 5 * or if the BIOS is too old. 6 * 7 * Copyright (C) 2004 Len Brown <len.brown@intel.com> 8 * Copyright (C) 2002 Andy Grover <andrew.grover@intel.com> 9 * 10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or (at 15 * your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, but 18 * WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * General Public License for more details. 21 * 22 * You should have received a copy of the GNU General Public License along 23 * with this program; if not, write to the Free Software Foundation, Inc., 24 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 25 * 26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 27 */ 28 29#include <linux/kernel.h> 30#include <linux/module.h> 31#include <linux/init.h> 32#include <linux/acpi.h> 33#include <acpi/acpi_bus.h> 34#include <linux/dmi.h> 35 36enum acpi_blacklist_predicates { 37 all_versions, 38 less_than_or_equal, 39 equal, 40 greater_than_or_equal, 41}; 42 43struct acpi_blacklist_item { 44 char oem_id[7]; 45 char oem_table_id[9]; 46 u32 oem_revision; 47 acpi_table_type table; 48 enum acpi_blacklist_predicates oem_revision_predicate; 49 char *reason; 50 u32 is_critical_error; 51}; 52 53/* 54 * POLICY: If *anything* doesn't work, put it on the blacklist. 55 * If they are critical errors, mark it critical, and abort driver load. 56 */ 57static struct acpi_blacklist_item acpi_blacklist[] __initdata = { 58 /* Compaq Presario 1700 */ 59 {"PTLTD ", " DSDT ", 0x06040000, ACPI_DSDT, less_than_or_equal, 60 "Multiple problems", 1}, 61 /* Sony FX120, FX140, FX150? */ 62 {"SONY ", "U0 ", 0x20010313, ACPI_DSDT, less_than_or_equal, 63 "ACPI driver problem", 1}, 64 /* Compaq Presario 800, Insyde BIOS */ 65 {"INT440", "SYSFexxx", 0x00001001, ACPI_DSDT, less_than_or_equal, 66 "Does not use _REG to protect EC OpRegions", 1}, 67 /* IBM 600E - _ADR should return 7, but it returns 1 */ 68 {"IBM ", "TP600E ", 0x00000105, ACPI_DSDT, less_than_or_equal, 69 "Incorrect _ADR", 1}, 70 {"ASUS\0\0", "P2B-S ", 0, ACPI_DSDT, all_versions, 71 "Bogus PCI routing", 1}, 72 73 {""} 74}; 75 76#if CONFIG_ACPI_BLACKLIST_YEAR 77 78static int __init blacklist_by_year(void) 79{ 80 int year; 81 char *s = dmi_get_system_info(DMI_BIOS_DATE); 82 83 if (!s) 84 return 0; 85 if (!*s) 86 return 0; 87 88 s = strrchr(s, '/'); 89 if (!s) 90 return 0; 91 92 s += 1; 93 94 year = simple_strtoul(s, NULL, 0); 95 96 if (year < 100) { /* 2-digit year */ 97 year += 1900; 98 if (year < 1996) /* no dates < spec 1.0 */ 99 year += 100; 100 } 101 102 if (year < CONFIG_ACPI_BLACKLIST_YEAR) { 103 printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), " 104 "acpi=force is required to enable ACPI\n", 105 year, CONFIG_ACPI_BLACKLIST_YEAR); 106 return 1; 107 } 108 return 0; 109} 110#else 111static inline int blacklist_by_year(void) 112{ 113 return 0; 114} 115#endif 116 117int __init acpi_blacklisted(void) 118{ 119 int i = 0; 120 int blacklisted = 0; 121 struct acpi_table_header *table_header; 122 123 while (acpi_blacklist[i].oem_id[0] != '\0') { 124 if (acpi_get_table_header_early 125 (acpi_blacklist[i].table, &table_header)) { 126 i++; 127 continue; 128 } 129 130 if (strncmp(acpi_blacklist[i].oem_id, table_header->oem_id, 6)) { 131 i++; 132 continue; 133 } 134 135 if (strncmp 136 (acpi_blacklist[i].oem_table_id, table_header->oem_table_id, 137 8)) { 138 i++; 139 continue; 140 } 141 142 if ((acpi_blacklist[i].oem_revision_predicate == all_versions) 143 || (acpi_blacklist[i].oem_revision_predicate == 144 less_than_or_equal 145 && table_header->oem_revision <= 146 acpi_blacklist[i].oem_revision) 147 || (acpi_blacklist[i].oem_revision_predicate == 148 greater_than_or_equal 149 && table_header->oem_revision >= 150 acpi_blacklist[i].oem_revision) 151 || (acpi_blacklist[i].oem_revision_predicate == equal 152 && table_header->oem_revision == 153 acpi_blacklist[i].oem_revision)) { 154 155 printk(KERN_ERR PREFIX 156 "Vendor \"%6.6s\" System \"%8.8s\" " 157 "Revision 0x%x has a known ACPI BIOS problem.\n", 158 acpi_blacklist[i].oem_id, 159 acpi_blacklist[i].oem_table_id, 160 acpi_blacklist[i].oem_revision); 161 162 printk(KERN_ERR PREFIX 163 "Reason: %s. This is a %s error\n", 164 acpi_blacklist[i].reason, 165 (acpi_blacklist[i]. 166 is_critical_error ? "non-recoverable" : 167 "recoverable")); 168 169 blacklisted = acpi_blacklist[i].is_critical_error; 170 break; 171 } else { 172 i++; 173 } 174 } 175 176 blacklisted += blacklist_by_year(); 177 178 return blacklisted; 179}