2019-05-27 09:55:06 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* blacklist . c
*
* Check to see if the given machine has a known bad ACPI BIOS
* or if the BIOS is too old .
2016-05-03 11:49:01 +03:00
* Check given machine against acpi_rev_dmi_table [ ] .
2005-04-17 02:20:36 +04:00
*
* Copyright ( C ) 2004 Len Brown < len . brown @ intel . com >
* Copyright ( C ) 2002 Andy Grover < andrew . grover @ intel . com >
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/acpi.h>
# include <linux/dmi.h>
2009-07-29 00:45:54 +04:00
# include "internal.h"
2019-07-10 16:05:43 +03:00
# ifdef CONFIG_DMI
2017-09-14 12:59:30 +03:00
static const struct dmi_system_id acpi_rev_dmi_table [ ] __initconst ;
2019-07-10 16:05:43 +03:00
# endif
2008-01-24 04:50:56 +03:00
2005-04-17 02:20:36 +04:00
/*
* POLICY : If * anything * doesn ' t work , put it on the blacklist .
* If they are critical errors , mark it critical , and abort driver load .
*/
2017-08-24 01:54:43 +03:00
static struct acpi_platform_list acpi_blacklist [ ] __initdata = {
2005-04-17 02:20:36 +04:00
/* Compaq Presario 1700 */
2007-02-02 19:48:19 +03:00
{ " PTLTD " , " DSDT " , 0x06040000 , ACPI_SIG_DSDT , less_than_or_equal ,
2005-08-05 08:44:28 +04:00
" Multiple problems " , 1 } ,
2005-04-17 02:20:36 +04:00
/* Sony FX120, FX140, FX150? */
2007-02-02 19:48:19 +03:00
{ " SONY " , " U0 " , 0x20010313 , ACPI_SIG_DSDT , less_than_or_equal ,
2005-08-05 08:44:28 +04:00
" ACPI driver problem " , 1 } ,
2005-04-17 02:20:36 +04:00
/* Compaq Presario 800, Insyde BIOS */
2007-02-02 19:48:19 +03:00
{ " INT440 " , " SYSFexxx " , 0x00001001 , ACPI_SIG_DSDT , less_than_or_equal ,
2005-08-05 08:44:28 +04:00
" Does not use _REG to protect EC OpRegions " , 1 } ,
2005-04-17 02:20:36 +04:00
/* IBM 600E - _ADR should return 7, but it returns 1 */
2007-02-02 19:48:19 +03:00
{ " IBM " , " TP600E " , 0x00000105 , ACPI_SIG_DSDT , less_than_or_equal ,
2005-08-05 08:44:28 +04:00
" Incorrect _ADR " , 1 } ,
2005-04-17 02:20:36 +04:00
2017-08-24 01:54:43 +03:00
{ }
2005-04-17 02:20:36 +04:00
} ;
2005-08-05 08:44:28 +04:00
int __init acpi_blacklisted ( void )
2005-04-17 02:20:36 +04:00
{
2017-08-24 01:54:43 +03:00
int i ;
2005-04-17 02:20:36 +04:00
int blacklisted = 0 ;
2005-08-05 08:44:28 +04:00
2017-08-24 01:54:43 +03:00
i = acpi_match_platform_list ( acpi_blacklist ) ;
if ( i > = 0 ) {
pr_err ( PREFIX " Vendor \" %6.6s \" System \" %8.8s \" Revision 0x%x has a known ACPI BIOS problem. \n " ,
acpi_blacklist [ i ] . oem_id ,
acpi_blacklist [ i ] . oem_table_id ,
acpi_blacklist [ i ] . oem_revision ) ;
2005-08-05 08:44:28 +04:00
2017-08-24 01:54:43 +03:00
pr_err ( PREFIX " Reason: %s. This is a %s error \n " ,
acpi_blacklist [ i ] . reason ,
( acpi_blacklist [ i ] . data ?
" non-recoverable " : " recoverable " ) ) ;
2005-04-17 02:20:36 +04:00
2017-08-24 01:54:43 +03:00
blacklisted = acpi_blacklist [ i ] . data ;
2005-04-17 02:20:36 +04:00
}
2016-05-03 11:49:01 +03:00
( void ) early_acpi_osi_init ( ) ;
2019-07-10 16:05:43 +03:00
# ifdef CONFIG_DMI
2016-05-03 11:49:01 +03:00
dmi_check_system ( acpi_rev_dmi_table ) ;
2019-07-10 16:05:43 +03:00
# endif
2008-01-24 04:50:56 +03:00
2005-04-17 02:20:36 +04:00
return blacklisted ;
}
2008-01-24 04:50:56 +03:00
# ifdef CONFIG_DMI
2015-07-03 02:06:00 +03:00
# ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
static int __init dmi_enable_rev_override ( const struct dmi_system_id * d )
{
printk ( KERN_NOTICE PREFIX " DMI detected: %s (force ACPI _REV to 5) \n " ,
d - > ident ) ;
acpi_rev_override_setup ( NULL ) ;
return 0 ;
}
# endif
2008-01-24 05:19:27 +03:00
2017-09-14 12:59:30 +03:00
static const struct dmi_system_id acpi_rev_dmi_table [ ] __initconst = {
2015-07-03 02:06:00 +03:00
# ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
/*
* DELL XPS 13 ( 2015 ) switches sound between HDA and I2S
* depending on the ACPI _REV callback . If userspace supports
* I2S sufficiently ( or if you do not care about sound ) , you
* can safely disable this quirk .
*/
{
. callback = dmi_enable_rev_override ,
. ident = " DELL XPS 13 (2015) " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc. " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " XPS 13 9343 " ) ,
} ,
} ,
2016-10-28 21:54:04 +03:00
{
. callback = dmi_enable_rev_override ,
. ident = " DELL Precision 5520 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc. " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " Precision 5520 " ) ,
} ,
} ,
{
. callback = dmi_enable_rev_override ,
. ident = " DELL Precision 3520 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc. " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " Precision 3520 " ) ,
} ,
} ,
2016-11-12 06:29:14 +03:00
/*
* Resolves a quirk with the Dell Latitude 3350 that
* causes the ethernet adapter to not function .
*/
{
. callback = dmi_enable_rev_override ,
. ident = " DELL Latitude 3350 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc. " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " Latitude 3350 " ) ,
} ,
} ,
2017-04-12 11:12:45 +03:00
{
. callback = dmi_enable_rev_override ,
. ident = " DELL Inspiron 7537 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Inc. " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " Inspiron 7537 " ) ,
} ,
} ,
2015-07-03 02:06:00 +03:00
# endif
2008-01-24 04:50:56 +03:00
{ }
} ;
# endif /* CONFIG_DMI */