/*
 *  blacklist.c
 *
 *  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 <len.brown@intel.com>
 *  Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <acpi/acpi_bus.h>
#include <linux/dmi.h>

enum acpi_blacklist_predicates {
	all_versions,
	less_than_or_equal,
	equal,
	greater_than_or_equal,
};

struct acpi_blacklist_item {
	char oem_id[7];
	char oem_table_id[9];
	u32 oem_revision;
	char *table;
	enum acpi_blacklist_predicates oem_revision_predicate;
	char *reason;
	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.
 */
static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
	/* Compaq Presario 1700 */
	{"PTLTD ", "  DSDT  ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal,
	 "Multiple problems", 1},
	/* Sony FX120, FX140, FX150? */
	{"SONY  ", "U0      ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal,
	 "ACPI driver problem", 1},
	/* Compaq Presario 800, Insyde BIOS */
	{"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_DSDT, less_than_or_equal,
	 "Does not use _REG to protect EC OpRegions", 1},
	/* 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},

	{""}
};

#if	CONFIG_ACPI_BLACKLIST_YEAR

static int __init blacklist_by_year(void)
{
	int year = dmi_get_year(DMI_BIOS_DATE);
	/* Doesn't exist? Likely an old system */
	if (year == -1) {
		printk(KERN_ERR PREFIX "no DMI BIOS year, "
			"acpi=force is required to enable ACPI\n" );
		return 1;
	}
	/* 0? Likely a buggy new BIOS */
	if (year == 0) {
		printk(KERN_ERR PREFIX "DMI BIOS year==0, "
			"assuming ACPI-capable machine\n" );
		return 0;
	}
	if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
		printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
		       "acpi=force is required to enable ACPI\n",
		       year, CONFIG_ACPI_BLACKLIST_YEAR);
		return 1;
	}
	return 0;
}
#else
static inline int blacklist_by_year(void)
{
	return 0;
}
#endif

int __init acpi_blacklisted(void)
{
	int i = 0;
	int blacklisted = 0;
	struct acpi_table_header table_header;

	while (acpi_blacklist[i].oem_id[0] != '\0') {
		if (acpi_get_table_header(acpi_blacklist[i].table, 0, &table_header)) {
			i++;
			continue;
		}

		if (strncmp(acpi_blacklist[i].oem_id, table_header.oem_id, 6)) {
			i++;
			continue;
		}

		if (strncmp
		    (acpi_blacklist[i].oem_table_id, table_header.oem_table_id,
		     8)) {
			i++;
			continue;
		}

		if ((acpi_blacklist[i].oem_revision_predicate == all_versions)
		    || (acpi_blacklist[i].oem_revision_predicate ==
			less_than_or_equal
			&& table_header.oem_revision <=
			acpi_blacklist[i].oem_revision)
		    || (acpi_blacklist[i].oem_revision_predicate ==
			greater_than_or_equal
			&& table_header.oem_revision >=
			acpi_blacklist[i].oem_revision)
		    || (acpi_blacklist[i].oem_revision_predicate == equal
			&& table_header.oem_revision ==
			acpi_blacklist[i].oem_revision)) {

			printk(KERN_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);

			printk(KERN_ERR PREFIX
			       "Reason: %s. This is a %s error\n",
			       acpi_blacklist[i].reason,
			       (acpi_blacklist[i].
				is_critical_error ? "non-recoverable" :
				"recoverable"));

			blacklisted = acpi_blacklist[i].is_critical_error;
			break;
		} else {
			i++;
		}
	}

	blacklisted += blacklist_by_year();

	dmi_check_system(acpi_osi_dmi_table);

	return blacklisted;
}
#ifdef CONFIG_DMI
static int __init dmi_enable_osi_linux(const struct dmi_system_id *d)
{
	acpi_dmi_osi_linux(1, d);	/* enable */
	return 0;
}
static int __init dmi_disable_osi_linux(const struct dmi_system_id *d)
{
	acpi_dmi_osi_linux(0, d);	/* disable */
	return 0;
}
static int __init dmi_unknown_osi_linux(const 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 5050"),
	 * 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"),
	 */
	{
	.callback = dmi_disable_osi_linux,
	.ident = "Acer, inc.",
	.matches = {
		     DMI_MATCH(DMI_SYS_VENDOR, "Acer, inc."),
		},
	},
	/*
	 * Disable OSI(Linux) warnings on all "Acer"
	 *
	 * _OSI(Linux) effect unknown:
	 * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
	 * 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, breaks suspend to disk */
	.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"),
	 */
	{
	.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 */
