ACPI: sync blacklist w/ latest
Subsystems (2)
Len Brown
reviewerPATCH 1/1 ACPI: sync blacklist w/ latest
From: Len Brown <[email protected]>
This patch is appropriate for supporting a 2.6.23-based products.
Signed-off-by Len Brown <[email protected]>
--- drivers/acpi/blacklist.c | 388 ++++++++++++++++++++++++++++++++++++++++++++- drivers/acpi/osl.c | 173 +++++++++++++++----- drivers/firmware/dmi-id.c | 2 - include/linux/acpi.h | 7 +- include/linux/dmi.h | 2 + 5 files changed, 523 insertions(+), 49 deletions(-)
drivers/acpi/blacklist.c +386 -2
@@ -3,6 +3,7 @@* * Check to see if the given machine has a known bad ACPI BIOS * or if the BIOS is too old. +* Check given machine against acpi_osi_dmi_table[]. * * Copyright (C) 2004 Len Brown <[email protected]> * Copyright (C) 2002 Andy Grover <[email protected]>
@@ -50,6 +51,8 @@ struct acpi_blacklist_item {u32 is_critical_error; }; +static struct dmi_system_id acpi_osi_dmi_table[]__initdata ; +/* * POLICY: If *anything* doesn't work, put it on the blacklist. * If they are critical errors, mark it critical, and abort driver load.
@@ -67,8 +70,6 @@ static struct acpi_blacklist_item acpi_blacklist[] __initdata = {/* IBM 600E - _ADR should return 7, but it returns 1 */ {"IBM " ,"TP600E " ,0x00000105 ,ACPI_SIG_DSDT , less_than_or_equal, "Incorrect _ADR", 1}, - {"ASUS\0\0", "P2B-S ", 0, ACPI_SIG_DSDT, all_versions, - "Bogus PCI routing", 1}, {""} };
@@ -165,5 +166,388 @@ int __init acpi_blacklisted(void) blacklisted +=blacklist_by_year (); +dmi_check_system (acpi_osi_dmi_table); +return blacklisted; } +#ifdef CONFIG_DMI +static int __init dmi_enable_osi_linux (struct dmi_system_id *d) +{ +acpi_dmi_osi_linux (1 , d);/* enable */ +return 0 ; +} +static int __init dmi_disable_osi_linux (struct dmi_system_id *d) +{ +acpi_dmi_osi_linux (0 , d);/* disable */ +return 0 ; +} +static int __init dmi_unknown_osi_linux (struct dmi_system_id *d) +{ +acpi_dmi_osi_linux (-1 , d);/* unknown */ +return 0 ; +} + +/* +* Most BIOS that invoke OSI(Linux) do nothing with it. +* But some cause Linux to break. +* Only a couple use it to make Linux run better. +* +* Thus, Linux should continue to disable OSI(Linux) by default, +* should continue to discourage BIOS writers from using it, and +* should whitelist the few existing systems that require it. +* +* If it appears clear a vendor isn't using OSI(Linux) +* for anything constructive, blacklist them by name to disable +* unnecessary dmesg warnings on all of their products. +*/ + +static struct dmi_system_id acpi_osi_dmi_table[]__initdata = { +/* +* Disable OSI(Linux) warnings on all "Acer, inc." +* +* _OSI(Linux) disables the latest Windows BIOS code: +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"), +* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"), +* _OSI(Linux) effect unknown: +* DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"), +*/ +/* +* note that dmi_check_system() uses strstr() +* to match sub-strings rather than !strcmp(), +* so "Acer" below matches "Acer, inc." above. +*/ +/* +* Disable OSI(Linux) warnings on all "Acer" +* +* _OSI(Linux) effect unknown: +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"), +* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"), +* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"), +* DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"), +*/ + { + .callback = dmi_unknown_osi_linux, + .ident ="Acer" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "Apple Computer, Inc." +* +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), +* DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), +* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), +* _OSI(Linux) effect unknown: +* DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"), +* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), +* DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Apple" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Apple Computer, Inc." ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "BenQ" +* +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="BenQ" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"BenQ" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "Clevo Co." +* +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Clevo" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Clevo Co." ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "COMPAL" +* +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_BOARD_NAME, "HEL8X"), +* _OSI(Linux) unknown effect: +* DMI_MATCH(DMI_BOARD_NAME, "IFL91"), +*/ + { + .callback = dmi_unknown_osi_linux, + .ident ="Compal" , + .matches = { +DMI_MATCH (DMI_BIOS_VENDOR ,"COMPAL" ), + }, + }, + {/* OSI(Linux) touches USB, unknown side-effect */ + .callback = dmi_disable_osi_linux, + .ident ="Dell Dimension 5150" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Dell DM051" ), + }, + }, + {/* OSI(Linux) is a NOP */ + .callback = dmi_disable_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Inspiron 1501" ), + }, + }, + {/* OSI(Linux) effect unknown */ + .callback = dmi_unknown_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Latitude D830" ), + }, + }, + {/* OSI(Linux) effect unknown */ + .callback = dmi_unknown_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"OptiPlex GX620" ), + }, + }, + {/* OSI(Linux) effect unknown */ + .callback = dmi_unknown_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"PowerEdge 1900" ), + }, + }, + {/* OSI(Linux) touches USB */ + .callback = dmi_disable_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Precision WorkStation 390" ), + }, + }, + {/* OSI(Linux) is a NOP */ + .callback = dmi_disable_osi_linux, + .ident ="Dell Vostro 1000" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Vostro 1000" ), + }, + }, + {/* OSI(Linux) effect unknown */ + .callback = dmi_unknown_osi_linux, + .ident ="Dell" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"PowerEdge SC440" ), + }, + }, + {/* OSI(Linux) effect unknown */ + .callback = dmi_unknown_osi_linux, + .ident ="Dialogue Flybook V5" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dialogue Technology Corporation" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Flybook V5" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "FUJITSU SIEMENS" +* +* _OSI(Linux) disables latest Windows BIOS code: +* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"), +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"), +* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"), +* DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"), +* _OSI(Linux) unknown effect: +* DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"), +* DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Fujitsu Siemens" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU SIEMENS" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "Hewlett-Packard" +* +* _OSI(Linux) confirmed to be a NOP: +* .ident = "HP Pavilion tx 1000" +* DMI_MATCH(DMI_BOARD_NAME, "30BF"), +* .ident = "HP Pavilion dv2000" +* DMI_MATCH(DMI_BOARD_NAME, "30B5"), +* .ident = "HP Pavilion dv5000", +* DMI_MATCH(DMI_BOARD_NAME, "30A7"), +* .ident = "HP Pavilion dv6300 30BC", +* DMI_MATCH(DMI_BOARD_NAME, "30BC"), +* .ident = "HP Pavilion dv6000", +* DMI_MATCH(DMI_BOARD_NAME, "30B7"), +* DMI_MATCH(DMI_BOARD_NAME, "30B8"), +* .ident = "HP Pavilion dv9000", +* DMI_MATCH(DMI_BOARD_NAME, "30B9"), +* .ident = "HP Pavilion dv9500", +* DMI_MATCH(DMI_BOARD_NAME, "30CB"), +* .ident = "HP/Compaq Presario C500", +* DMI_MATCH(DMI_BOARD_NAME, "30C6"), +* .ident = "HP/Compaq Presario F500", +* DMI_MATCH(DMI_BOARD_NAME, "30D3"), +* _OSI(Linux) unknown effect: +* .ident = "HP Pavilion dv6500", +* DMI_MATCH(DMI_BOARD_NAME, "30D0"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Hewlett-Packard" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), + }, + }, +/* +* Lenovo has a mix of systems OSI(Linux) situations +* and thus we can not wildcard the vendor. +* +* _OSI(Linux) helps sound +* DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"), +* DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"), +* _OSI(Linux) is a NOP: +* DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), +*/ + { + .callback = dmi_enable_osi_linux, + .ident ="Lenovo ThinkPad R61" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"ThinkPad R61" ), + }, + }, + { + .callback = dmi_enable_osi_linux, + .ident ="Lenovo ThinkPad T61" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"ThinkPad T61" ), + }, + }, + { + .callback = dmi_unknown_osi_linux, + .ident ="Lenovo 3000 V100" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"LENOVO3000 V100" ), + }, + }, + { + .callback = dmi_disable_osi_linux, + .ident ="Lenovo 3000 N100" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_VERSION ,"3000 N100" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "LG Electronics" +* +* _OSI(Linux) confirmed to be a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"), +* with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), +* +* unknown: +* DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"), +* with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="LG" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LG Electronics" ), + }, + }, +/* NEC - OSI(Linux) effect unknown */ + { + .callback = dmi_unknown_osi_linux, + .ident ="NEC VERSA M360" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"NEC Computers SAS" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"NEC VERSA M360" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "Samsung Electronics" +* +* OSI(Linux) disables PNP0C32 and other BIOS code for Windows: +* DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"), +* DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Samsung" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"SAMSUNG ELECTRONICS CO., LTD." ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "Sony Corporation" +* +* _OSI(Linux) is a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"), +* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"), +* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"), +* _OSI(Linux) unknown effect: +* DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"), +*/ + { + .callback = dmi_unknown_osi_linux, + .ident ="Sony" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Sony Corporation" ), + }, + }, +/* +* Disable OSI(Linux) warnings on all "TOSHIBA" +* +* _OSI(Linux) breaks sound (bugzilla 7787): +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"), +* _OSI(Linux) is a NOP: +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"), +* _OSI(Linux) unknown effect: +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"), +* DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"), +*/ + { + .callback = dmi_disable_osi_linux, + .ident ="Toshiba" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + }, + }, + {} +}; + +#endif /* CONFIG_DMI */
drivers/acpi/osl.c +130 -43
220 lines not on this page · raw message
drivers/firmware/dmi-id.c +0 -2
@@ -159,8 +159,6 @@ static struct device *dmi_dev;if (dmi_get_system_info (_field)) \ sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr; -extern int dmi_available; -static int __init dmi_id_init (void ) {int ret, i;
include/linux/acpi.h +5 -2
@@ -40,6 +40,7 @@#include <acpi/acpi_drivers.h> #include <acpi/acpi_numa.h> #include <asm/acpi.h> +#include <linux/dmi.h> #ifdef CONFIG_ACPI
@@ -187,7 +188,9 @@ extern int ec_transaction(u8 command,#endif /*CONFIG_ACPI_EC*/ extern int acpi_blacklisted (void ); -extern void acpi_bios_year (char *s); +#ifdef CONFIG_DMI +extern void acpi_dmi_osi_linux (int enable,const struct dmi_system_id *d); +#endif #define ACPI_CSTATE_LIMIT_DEFINED /* for driver builds */ #ifdef CONFIG_ACPI
@@ -247,5 +250,5 @@ static inline int acpi_boot_table_init(void)return 0 ; } -#endif /* CONFIG_ACPI */ +#endif /* !CONFIG_ACPI */ #endif /*_LINUX_ACPI_H*/
include/linux/dmi.h +2 -0
@@ -78,6 +78,7 @@ extern struct dmi_device * dmi_find_device(int type, const char *name,extern void dmi_scan_machine (void );extern int dmi_get_year (int field);extern int dmi_name_in_vendors (char *str); +extern int dmi_available;#else
@@ -87,6 +88,7 @@ static inline struct dmi_device * dmi_find_device(int type, const char *name, struct dmi_device *from) { return NULL; }static inline int dmi_get_year (int year) {return 0 ; }static inline int dmi_name_in_vendors (char *s) {return 0 ; } +#define dmi_available 0#endif
Signature · 1 line
1.5.4.rc5.16.gc0279