xref: /openbmc/linux/drivers/acpi/blacklist.c (revision a1e58bbd)
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  *  Check given machine against acpi_osi_dmi_table[].
7  *
8  *  Copyright (C) 2004 Len Brown <len.brown@intel.com>
9  *  Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
10  *
11  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12  *
13  *  This program is free software; you can redistribute it and/or modify
14  *  it under the terms of the GNU General Public License as published by
15  *  the Free Software Foundation; either version 2 of the License, or (at
16  *  your option) any later version.
17  *
18  *  This program is distributed in the hope that it will be useful, but
19  *  WITHOUT ANY WARRANTY; without even the implied warranty of
20  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  *  General Public License for more details.
22  *
23  *  You should have received a copy of the GNU General Public License along
24  *  with this program; if not, write to the Free Software Foundation, Inc.,
25  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26  *
27  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28  */
29 
30 #include <linux/kernel.h>
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/acpi.h>
34 #include <acpi/acpi_bus.h>
35 #include <linux/dmi.h>
36 
37 enum acpi_blacklist_predicates {
38 	all_versions,
39 	less_than_or_equal,
40 	equal,
41 	greater_than_or_equal,
42 };
43 
44 struct acpi_blacklist_item {
45 	char oem_id[7];
46 	char oem_table_id[9];
47 	u32 oem_revision;
48 	char *table;
49 	enum acpi_blacklist_predicates oem_revision_predicate;
50 	char *reason;
51 	u32 is_critical_error;
52 };
53 
54 static struct dmi_system_id acpi_osi_dmi_table[] __initdata;
55 
56 /*
57  * POLICY: If *anything* doesn't work, put it on the blacklist.
58  *	   If they are critical errors, mark it critical, and abort driver load.
59  */
60 static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
61 	/* Compaq Presario 1700 */
62 	{"PTLTD ", "  DSDT  ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal,
63 	 "Multiple problems", 1},
64 	/* Sony FX120, FX140, FX150? */
65 	{"SONY  ", "U0      ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal,
66 	 "ACPI driver problem", 1},
67 	/* Compaq Presario 800, Insyde BIOS */
68 	{"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_DSDT, less_than_or_equal,
69 	 "Does not use _REG to protect EC OpRegions", 1},
70 	/* IBM 600E - _ADR should return 7, but it returns 1 */
71 	{"IBM   ", "TP600E  ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
72 	 "Incorrect _ADR", 1},
73 
74 	{""}
75 };
76 
77 #if	CONFIG_ACPI_BLACKLIST_YEAR
78 
79 static int __init blacklist_by_year(void)
80 {
81 	int year = dmi_get_year(DMI_BIOS_DATE);
82 	/* Doesn't exist? Likely an old system */
83 	if (year == -1) {
84 		printk(KERN_ERR PREFIX "no DMI BIOS year, "
85 			"acpi=force is required to enable ACPI\n" );
86 		return 1;
87 	}
88 	/* 0? Likely a buggy new BIOS */
89 	if (year == 0) {
90 		printk(KERN_ERR PREFIX "DMI BIOS year==0, "
91 			"assuming ACPI-capable machine\n" );
92 		return 0;
93 	}
94 	if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
95 		printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
96 		       "acpi=force is required to enable ACPI\n",
97 		       year, CONFIG_ACPI_BLACKLIST_YEAR);
98 		return 1;
99 	}
100 	return 0;
101 }
102 #else
103 static inline int blacklist_by_year(void)
104 {
105 	return 0;
106 }
107 #endif
108 
109 int __init acpi_blacklisted(void)
110 {
111 	int i = 0;
112 	int blacklisted = 0;
113 	struct acpi_table_header table_header;
114 
115 	while (acpi_blacklist[i].oem_id[0] != '\0') {
116 		if (acpi_get_table_header(acpi_blacklist[i].table, 0, &table_header)) {
117 			i++;
118 			continue;
119 		}
120 
121 		if (strncmp(acpi_blacklist[i].oem_id, table_header.oem_id, 6)) {
122 			i++;
123 			continue;
124 		}
125 
126 		if (strncmp
127 		    (acpi_blacklist[i].oem_table_id, table_header.oem_table_id,
128 		     8)) {
129 			i++;
130 			continue;
131 		}
132 
133 		if ((acpi_blacklist[i].oem_revision_predicate == all_versions)
134 		    || (acpi_blacklist[i].oem_revision_predicate ==
135 			less_than_or_equal
136 			&& table_header.oem_revision <=
137 			acpi_blacklist[i].oem_revision)
138 		    || (acpi_blacklist[i].oem_revision_predicate ==
139 			greater_than_or_equal
140 			&& table_header.oem_revision >=
141 			acpi_blacklist[i].oem_revision)
142 		    || (acpi_blacklist[i].oem_revision_predicate == equal
143 			&& table_header.oem_revision ==
144 			acpi_blacklist[i].oem_revision)) {
145 
146 			printk(KERN_ERR PREFIX
147 			       "Vendor \"%6.6s\" System \"%8.8s\" "
148 			       "Revision 0x%x has a known ACPI BIOS problem.\n",
149 			       acpi_blacklist[i].oem_id,
150 			       acpi_blacklist[i].oem_table_id,
151 			       acpi_blacklist[i].oem_revision);
152 
153 			printk(KERN_ERR PREFIX
154 			       "Reason: %s. This is a %s error\n",
155 			       acpi_blacklist[i].reason,
156 			       (acpi_blacklist[i].
157 				is_critical_error ? "non-recoverable" :
158 				"recoverable"));
159 
160 			blacklisted = acpi_blacklist[i].is_critical_error;
161 			break;
162 		} else {
163 			i++;
164 		}
165 	}
166 
167 	blacklisted += blacklist_by_year();
168 
169 	dmi_check_system(acpi_osi_dmi_table);
170 
171 	return blacklisted;
172 }
173 #ifdef CONFIG_DMI
174 static int __init dmi_enable_osi_linux(const struct dmi_system_id *d)
175 {
176 	acpi_dmi_osi_linux(1, d);	/* enable */
177 	return 0;
178 }
179 static int __init dmi_disable_osi_linux(const struct dmi_system_id *d)
180 {
181 	acpi_dmi_osi_linux(0, d);	/* disable */
182 	return 0;
183 }
184 static int __init dmi_unknown_osi_linux(const struct dmi_system_id *d)
185 {
186 	acpi_dmi_osi_linux(-1, d);	/* unknown */
187 	return 0;
188 }
189 static int __init dmi_disable_osi_vista(const struct dmi_system_id *d)
190 {
191 	printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
192 	acpi_osi_setup("!Windows 2006");
193 	return 0;
194 }
195 
196 /*
197  * Most BIOS that invoke OSI(Linux) do nothing with it.
198  * But some cause Linux to break.
199  * Only a couple use it to make Linux run better.
200  *
201  * Thus, Linux should continue to disable OSI(Linux) by default,
202  * should continue to discourage BIOS writers from using it, and
203  * should whitelist the few existing systems that require it.
204  *
205  * If it appears clear a vendor isn't using OSI(Linux)
206  * for anything constructive, blacklist them by name to disable
207  * unnecessary dmesg warnings on all of their products.
208  */
209 
210 static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
211 	/*
212 	 * Disable OSI(Linux) warnings on all "Acer, inc."
213 	 *
214 	 * _OSI(Linux) disables the latest Windows BIOS code:
215 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
216 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
217 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
218 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
219 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
220 	 * _OSI(Linux) effect unknown:
221 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
222 	 */
223 	/*
224 	 * note that dmi_check_system() uses strstr()
225 	 * to match sub-strings rather than !strcmp(),
226 	 * so "Acer" below matches "Acer, inc." above.
227 	 */
228 	/*
229 	 * Disable OSI(Linux) warnings on all "Acer"
230 	 *
231 	 * _OSI(Linux) effect unknown:
232 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
233 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
234 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
235 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"),
236 	 * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"),
237 	 *
238 	 * _OSI(Linux) is a NOP:
239 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
240 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"),
241 	 */
242 	{
243 	.callback = dmi_disable_osi_linux,
244 	.ident = "Acer",
245 	.matches = {
246 		     DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
247 		},
248 	},
249 	/*
250 	 * Disable OSI(Linux) warnings on all "Apple Computer, Inc."
251 	 * Disable OSI(Linux) warnings on all "Apple Inc."
252 	 *
253 	 * _OSI(Linux) confirmed to be a NOP:
254 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
255 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
256 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
257 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
258 	 * _OSI(Linux) effect unknown:
259 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"),
260 	 * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
261 	 */
262 	{
263 	.callback = dmi_disable_osi_linux,
264 	.ident = "Apple",
265 	.matches = {
266 		     DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
267 		},
268 	},
269 	/*
270 	 * Disable OSI(Linux) warnings on all "BenQ"
271 	 *
272 	 * _OSI(Linux) confirmed to be a NOP:
273 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"),
274 	 */
275 	{
276 	.callback = dmi_disable_osi_linux,
277 	.ident = "BenQ",
278 	.matches = {
279 		     DMI_MATCH(DMI_SYS_VENDOR, "BenQ"),
280 		},
281 	},
282 	/*
283 	 * Disable OSI(Linux) warnings on all "Clevo Co."
284 	 *
285 	 * _OSI(Linux) confirmed to be a NOP:
286 	 * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"),
287 	 */
288 	{
289 	.callback = dmi_disable_osi_linux,
290 	.ident = "Clevo",
291 	.matches = {
292 		     DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."),
293 		},
294 	},
295 	/*
296 	 * Disable OSI(Linux) warnings on all "COMPAL"
297 	 *
298 	 * _OSI(Linux) confirmed to be a NOP:
299 	 * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"),
300 	 * _OSI(Linux) unknown effect:
301 	 * DMI_MATCH(DMI_BOARD_NAME, "IFL91"),
302 	 */
303 	{
304 	.callback = dmi_disable_osi_linux,
305 	.ident = "Compal",
306 	.matches = {
307 		     DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
308 		},
309 	},
310 	{ /* OSI(Linux) touches USB, unknown side-effect */
311 	.callback = dmi_disable_osi_linux,
312 	.ident = "Dell Dimension 5150",
313 	.matches = {
314 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
315 		     DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"),
316 		},
317 	},
318 	{ /* OSI(Linux) is a NOP */
319 	.callback = dmi_disable_osi_linux,
320 	.ident = "Dell i1501",
321 	.matches = {
322 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
323 		     DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"),
324 		},
325 	},
326 	{ /* OSI(Linux) effect unknown */
327 	.callback = dmi_unknown_osi_linux,
328 	.ident = "Dell Latitude D830",
329 	.matches = {
330 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
331 		     DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"),
332 		},
333 	},
334 	{ /* OSI(Linux) effect unknown */
335 	.callback = dmi_unknown_osi_linux,
336 	.ident = "Dell OptiPlex GX620",
337 	.matches = {
338 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
339 		     DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"),
340 		},
341 	},
342 	{ /* OSI(Linux) causes some USB initialization to not run */
343 	.callback = dmi_unknown_osi_linux,
344 	.ident = "Dell OptiPlex 755",
345 	.matches = {
346 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
347 		     DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 755"),
348 		},
349 	},
350 	{ /* OSI(Linux) effect unknown */
351 	.callback = dmi_unknown_osi_linux,
352 	.ident = "Dell PE 1900",
353 	.matches = {
354 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
355 		     DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"),
356 		},
357 	},
358 	{ /* OSI(Linux) is a NOP */
359 	.callback = dmi_unknown_osi_linux,
360 	.ident = "Dell PE 1950",
361 	.matches = {
362 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
363 		     DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"),
364 		},
365 	},
366 	{ /* OSI(Linux) is a NOP */
367 	.callback = dmi_disable_osi_linux,
368 	.ident = "Dell PE R200",
369 	.matches = {
370 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
371 		     DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R200"),
372 		},
373 	},
374 	{ /* OSI(Linux) touches USB */
375 	.callback = dmi_disable_osi_linux,
376 	.ident = "Dell PR 390",
377 	.matches = {
378 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
379 		     DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"),
380 		},
381 	},
382 	{ /* OSI(Linux) touches USB */
383 	.callback = dmi_unknown_osi_linux,
384 	.ident = "Dell PR 390",
385 	.matches = {
386 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
387 		     DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 690"),
388 		},
389 	},
390 	{ /* OSI(Linux) unknown - ASL looks benign, but may effect dock/SMM */
391 	.callback = dmi_unknown_osi_linux,
392 	.ident = "Dell PR M4300",
393 	.matches = {
394 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
395 		     DMI_MATCH(DMI_PRODUCT_NAME, "Precision M4300"),
396 		},
397 	},
398 	{ /* OSI(Linux) is a NOP */
399 	.callback = dmi_disable_osi_linux,
400 	.ident = "Dell Vostro 1000",
401 	.matches = {
402 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
403 		     DMI_MATCH(DMI_PRODUCT_NAME, "Vostro   1000"),
404 		},
405 	},
406 	{ /* OSI(Linux) effect unknown */
407 	.callback = dmi_unknown_osi_linux,
408 	.ident = "Dell PE SC440",
409 	.matches = {
410 		     DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
411 		     DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"),
412 		},
413 	},
414 	{ /* OSI(Linux) effect unknown */
415 	.callback = dmi_unknown_osi_linux,
416 	.ident = "Dialogue Flybook V5",
417 	.matches = {
418 		     DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"),
419 		     DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"),
420 		},
421 	},
422 	/*
423 	 * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS"
424 	 *
425 	 * _OSI(Linux) disables latest Windows BIOS code:
426 	 * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"),
427 	 * _OSI(Linux) confirmed to be a NOP:
428 	 * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"),
429 	 * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"),
430 	 * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"),
431 	 * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
432 	 * _OSI(Linux) unknown effect:
433 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"),
434 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"),
435 	 */
436 	{
437 	.callback = dmi_disable_osi_linux,
438 	.ident = "Fujitsu Siemens",
439 	.matches = {
440 		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
441 		},
442 	},
443 	{
444 	.callback = dmi_disable_osi_vista,
445 	.ident = "Fujitsu Siemens",
446 	.matches = {
447 		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
448 	 	     DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
449 		},
450 	},
451 	/*
452 	 * Disable OSI(Linux) warnings on all "Hewlett-Packard"
453 	 *
454 	 * _OSI(Linux) confirmed to be a NOP:
455 	 * .ident = "HP Pavilion tx 1000"
456 	 * DMI_MATCH(DMI_BOARD_NAME, "30BF"),
457 	 * .ident = "HP Pavilion dv2000"
458 	 * DMI_MATCH(DMI_BOARD_NAME, "30B5"),
459 	 * .ident = "HP Pavilion dv5000",
460 	 * DMI_MATCH(DMI_BOARD_NAME, "30A7"),
461 	 * .ident = "HP Pavilion dv6300 30BC",
462 	 * DMI_MATCH(DMI_BOARD_NAME, "30BC"),
463 	 * .ident = "HP Pavilion dv6000",
464 	 * DMI_MATCH(DMI_BOARD_NAME, "30B7"),
465 	 * DMI_MATCH(DMI_BOARD_NAME, "30B8"),
466 	 * .ident = "HP Pavilion dv9000",
467 	 * DMI_MATCH(DMI_BOARD_NAME, "30B9"),
468 	 * .ident = "HP Pavilion dv9500",
469 	 * DMI_MATCH(DMI_BOARD_NAME, "30CB"),
470 	 * .ident = "HP/Compaq Presario C500",
471 	 * DMI_MATCH(DMI_BOARD_NAME, "30C6"),
472 	 * .ident = "HP/Compaq Presario F500",
473 	 * DMI_MATCH(DMI_BOARD_NAME, "30D3"),
474 	 * _OSI(Linux) unknown effect:
475 	 * .ident = "HP Pavilion dv6500",
476 	 * DMI_MATCH(DMI_BOARD_NAME, "30D0"),
477 	 */
478 	{
479 	.callback = dmi_disable_osi_linux,
480 	.ident = "Hewlett-Packard",
481 	.matches = {
482 		     DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
483 		},
484 	},
485 	/*
486 	 * Lenovo has a mix of systems OSI(Linux) situations
487 	 * and thus we can not wildcard the vendor.
488 	 *
489 	 * _OSI(Linux) helps sound
490 	 * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
491 	 * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
492 	 * _OSI(Linux) has Linux specific hooks
493 	 * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"),
494 	 * _OSI(Linux) is a NOP:
495 	 * DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
496 	 * DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"),
497 	 */
498 	{
499 	.callback = dmi_enable_osi_linux,
500 	.ident = "Lenovo ThinkPad R61",
501 	.matches = {
502 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
503 		     DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
504 		},
505 	},
506 	{
507 	.callback = dmi_enable_osi_linux,
508 	.ident = "Lenovo ThinkPad T61",
509 	.matches = {
510 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
511 		     DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
512 		},
513 	},
514 	{
515 	.callback = dmi_enable_osi_linux,
516 	.ident = "Lenovo ThinkPad X61",
517 	.matches = {
518 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
519 		     DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"),
520 		},
521 	},
522 	{
523 	.callback = dmi_disable_osi_linux,
524 	.ident = "Lenovo 3000 V100",
525 	.matches = {
526 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
527 		     DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"),
528 		},
529 	},
530 	{
531 	.callback = dmi_disable_osi_linux,
532 	.ident = "Lenovo 3000 N100",
533 	.matches = {
534 		     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
535 		     DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
536 		},
537 	},
538 	/*
539 	 * Disable OSI(Linux) warnings on all "LG Electronics"
540 	 *
541 	 * _OSI(Linux) confirmed to be a NOP:
542 	 * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
543 	 * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
544 	 *
545 	 * unknown:
546 	 * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
547 	 * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
548 	 */
549 	{
550 	.callback = dmi_disable_osi_linux,
551 	.ident = "LG",
552 	.matches = {
553 		     DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
554 		},
555 	},
556 	/* NEC - OSI(Linux) effect unknown */
557 	{
558 	.callback = dmi_unknown_osi_linux,
559 	.ident = "NEC VERSA M360",
560 	.matches = {
561 		     DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"),
562 		     DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"),
563 		},
564 	},
565 	/* Panasonic */
566 	{
567 	.callback = dmi_unknown_osi_linux,
568 	.ident = "Panasonic",
569 	.matches = {
570 		     DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
571 			/* Toughbook CF-52 */
572 		     DMI_MATCH(DMI_PRODUCT_NAME, "CF-52CCABVBG"),
573 		},
574 	},
575 	/*
576 	 * Disable OSI(Linux) warnings on all "Samsung Electronics"
577 	 *
578 	 * OSI(Linux) disables PNP0C32 and other BIOS code for Windows:
579 	 * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"),
580 	 * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
581 	 */
582 	{
583 	.callback = dmi_disable_osi_linux,
584 	.ident = "Samsung",
585 	.matches = {
586 		     DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
587 		},
588 	},
589 	/*
590 	 * Disable OSI(Linux) warnings on all "Sony Corporation"
591 	 *
592 	 * _OSI(Linux) is a NOP:
593 	 * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NR11S_S"),
594 	 * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"),
595 	 * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"),
596 	 * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"),
597 	 * _OSI(Linux) unknown effect:
598 	 * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"),
599 	 */
600 	{
601 	.callback = dmi_disable_osi_linux,
602 	.ident = "Sony",
603 	.matches = {
604 		     DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
605 		},
606 	},
607 	/*
608 	 * Disable OSI(Linux) warnings on all "TOSHIBA"
609 	 *
610 	 * _OSI(Linux) breaks sound (bugzilla 7787):
611 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"),
612 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"),
613 	 * _OSI(Linux) is a NOP:
614 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"),
615 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"),
616 	 * _OSI(Linux) unknown effect:
617 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"),
618 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"),
619 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"),
620 	 * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"),
621 	 */
622 	{
623 	.callback = dmi_disable_osi_linux,
624 	.ident = "Toshiba",
625 	.matches = {
626 		     DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
627 		},
628 	},
629 	{}
630 };
631 
632 #endif /* CONFIG_DMI */
633