dmi_scan.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 874 行 · 第 1/2 页

C
874
字号
 * The symptoms include hangs or reboots when suspending or resuming, * attaching or detaching the power cord, or entering BIOS setup screens * through magic key sequences. */static int __init local_apic_kills_bios(struct dmi_blacklist *d){#ifdef CONFIG_X86_LOCAL_APIC	extern int dont_enable_local_apic;	if (!dont_enable_local_apic) {		dont_enable_local_apic = 1;		printk(KERN_WARNING "%s with broken BIOS detected. "		       "Refusing to enable the local APIC.\n",		       d->ident);	}#endif	return 0;}/* * The Microstar 6163-2 (a.k.a Pro) mainboard will hang shortly after * resumes, and also at what appears to be asynchronous APM events, * if the local APIC is enabled. */static int __init apm_kills_local_apic(struct dmi_blacklist *d){#ifdef CONFIG_X86_LOCAL_APIC	extern int dont_enable_local_apic;	if (apm_info.bios.version && !dont_enable_local_apic) {		dont_enable_local_apic = 1;		printk(KERN_WARNING "%s with broken BIOS detected. "		       "Refusing to enable the local APIC.\n",		       d->ident);	}#endif	return 0;}/* * The Intel AL440LX mainboard will hang randomly if the local APIC * timer is running and the APM BIOS hasn't been disabled. */static int __init apm_kills_local_apic_timer(struct dmi_blacklist *d){#ifdef CONFIG_X86_LOCAL_APIC	extern int dont_use_local_apic_timer;	if (apm_info.bios.version && !dont_use_local_apic_timer) {		dont_use_local_apic_timer = 1;		printk(KERN_WARNING "%s with broken BIOS detected. "		       "The local APIC timer will not be used.\n",		       d->ident);	}#endif	return 0;}/* *	Simple "print if true" callback */ static __init int print_if_true(struct dmi_blacklist *d){	printk("%s\n", d->ident);	return 0;}/* *	Process the DMI blacklists */ /* *	This will be expanded over time to force things like the APM  *	interrupt mask settings according to the laptop */ static __initdata struct dmi_blacklist dmi_blacklist[]={#if 0	{ disable_ide_dma, "KT7", {	/* Overbroad right now - kill DMA on problem KT7 boards */			MATCH(DMI_PRODUCT_NAME, "KT7-RAID"),			NO_MATCH, NO_MATCH, NO_MATCH			} },#endif				{ broken_ps2_resume, "Dell Latitude C600", {	/* Handle problems with APM on the C600 */			MATCH(DMI_SYS_VENDOR, "Dell"),			MATCH(DMI_PRODUCT_NAME, "Latitude C600"),			NO_MATCH, NO_MATCH			} },	{ broken_apm_power, "Dell Inspiron 5000e", {	/* Handle problems with APM on Inspiron 5000e */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "A04"),			MATCH(DMI_BIOS_DATE, "08/24/2000"), NO_MATCH			} },	{ broken_apm_power, "Dell Inspiron 2500", {	/* Handle problems with APM on Inspiron 2500 */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "A12"),			MATCH(DMI_BIOS_DATE, "02/04/2002"), NO_MATCH			} },	{ set_realmode_power_off, "Award Software v4.60 PGMA", {	/* broken PM poweroff bios */			MATCH(DMI_BIOS_VENDOR, "Award Software International, Inc."),			MATCH(DMI_BIOS_VERSION, "4.60 PGMA"),			MATCH(DMI_BIOS_DATE, "134526184"), NO_MATCH			} },	{ set_smp_bios_reboot, "Dell PowerEdge 1300", {	/* Handle problems with rebooting on Dell 1300's */			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),			NO_MATCH, NO_MATCH			} },	{ set_bios_reboot, "Dell PowerEdge 300", {	/* Handle problems with rebooting on Dell 1300's */			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "PowerEdge 300/"),			NO_MATCH, NO_MATCH			} },	{ set_bios_reboot, "Dell PowerEdge 2400", {  /* Handle problems with rebooting on Dell 300/800's */			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),			NO_MATCH, NO_MATCH			} },	{ set_apm_ints, "Dell Inspiron", {	/* Allow interrupts during suspend on Dell Inspiron laptops*/			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "Inspiron 4000"),			NO_MATCH, NO_MATCH			} },	{ set_apm_ints, "Compaq 12XL125", {	/* Allow interrupts during suspend on Compaq Laptops*/			MATCH(DMI_SYS_VENDOR, "Compaq"),			MATCH(DMI_PRODUCT_NAME, "Compaq PC"),			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION,"4.06")			} },	{ set_apm_ints, "ASUSTeK", {   /* Allow interrupts during APM or the clock goes slow */			MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),			MATCH(DMI_PRODUCT_NAME, "L8400K series Notebook PC"),			NO_MATCH, NO_MATCH			} },						{ apm_is_horked, "Trigem Delhi3", { /* APM crashes */			MATCH(DMI_SYS_VENDOR, "TriGem Computer, Inc"),			MATCH(DMI_PRODUCT_NAME, "Delhi3"),			NO_MATCH, NO_MATCH,			} },	{ apm_is_horked, "Fujitsu-Siemens", { /* APM crashes */			MATCH(DMI_BIOS_VENDOR, "hoenix/FUJITSU SIEMENS"),			MATCH(DMI_BIOS_VERSION, "Version1.01"),			NO_MATCH, NO_MATCH,			} },	{ apm_is_horked, "Sharp PC-PJ/AX", { /* APM crashes */			MATCH(DMI_SYS_VENDOR, "SHARP"),			MATCH(DMI_PRODUCT_NAME, "PC-PJ/AX"),			MATCH(DMI_BIOS_VENDOR,"SystemSoft"),			MATCH(DMI_BIOS_VERSION,"Version R2.08")			} },	{ apm_is_horked, "Dell Inspiron 2500", { /* APM crashes */			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "Inspiron 2500"),			MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION,"A11")			} },	{ sony_vaio_laptop, "Sony Vaio", { /* This is a Sony Vaio laptop */			MATCH(DMI_SYS_VENDOR, "Sony Corporation"),			MATCH(DMI_PRODUCT_NAME, "PCG-"),			NO_MATCH, NO_MATCH,			} },	{ swab_apm_power_in_minutes, "Sony VAIO", { /* Handle problems with APM on Sony Vaio PCG-N505X(DE) */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0206H"),			MATCH(DMI_BIOS_DATE, "08/23/99"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", { /* Handle problems with APM on Sony Vaio PCG-N505VX */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "W2K06H0"),			MATCH(DMI_BIOS_DATE, "02/03/00"), NO_MATCH			} },				{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-XG29 */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0117A0"),			MATCH(DMI_BIOS_DATE, "04/25/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-Z600NE */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0121Z1"),			MATCH(DMI_BIOS_DATE, "05/11/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-Z600NE */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "WME01Z1"),			MATCH(DMI_BIOS_DATE, "08/11/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-Z600LEK(DE) */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0206Z3"),			MATCH(DMI_BIOS_DATE, "12/25/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-Z505LS */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0203D0"),			MATCH(DMI_BIOS_DATE, "05/12/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-Z505LS */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0203Z3"),			MATCH(DMI_BIOS_DATE, "08/25/00"), NO_MATCH			} },		{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-F104K */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0204K2"),			MATCH(DMI_BIOS_DATE, "08/28/00"), NO_MATCH			} },		{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-C1VN/C1VE */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0208P1"),			MATCH(DMI_BIOS_DATE, "11/09/00"), NO_MATCH			} },	{ swab_apm_power_in_minutes, "Sony VAIO", {	/* Handle problems with APM on Sony Vaio PCG-C1VE */			MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),			MATCH(DMI_BIOS_VERSION, "R0204P1"),			MATCH(DMI_BIOS_DATE, "09/12/00"), NO_MATCH			} },	/* Machines which have problems handling enabled local APICs */	{ local_apic_kills_bios, "Dell Inspiron", {			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "Inspiron"),			NO_MATCH, NO_MATCH			} },	{ local_apic_kills_bios, "Dell Latitude", {			MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),			MATCH(DMI_PRODUCT_NAME, "Latitude"),			NO_MATCH, NO_MATCH			} },	{ local_apic_kills_bios, "IBM Thinkpad T20", {			MATCH(DMI_BOARD_VENDOR, "IBM"),			MATCH(DMI_BOARD_NAME, "264741U"),			NO_MATCH, NO_MATCH			} },	{ apm_kills_local_apic, "Microstar 6163", {			MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),			MATCH(DMI_BOARD_NAME, "MS-6163"),			NO_MATCH, NO_MATCH } },	{ apm_kills_local_apic_timer, "Intel AL440LX", {			MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),			MATCH(DMI_BOARD_NAME, "AL440LX"),			NO_MATCH, NO_MATCH } },	/* Problem Intel 440GX bioses */	{ broken_pirq, "SABR1 Bios", {			/* Bad $PIR */			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),			MATCH(DMI_BIOS_VERSION,"SABR1"),			NO_MATCH, NO_MATCH			} },	{ broken_pirq, "l44GX Bios", {        		/* Bad $PIR */			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0094.P10"),			NO_MATCH, NO_MATCH                        } },	{ broken_pirq, "l44GX Bios", {        		/* Bad $PIR */			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0120.P12"),			NO_MATCH, NO_MATCH                        } },	{ broken_pirq, "l44GX Bios", {		/* Bad $PIR */			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0125.P13"),			NO_MATCH, NO_MATCH			} },	{ broken_pirq, "l44GX Bios", {		/* Bad $PIR */			MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),			MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07.9906041405"),			NO_MATCH, NO_MATCH			} },                        	/* Intel in disguise - In this case they can't hide and they don't run	   too well either... */	{ broken_pirq, "Dell PowerEdge 8450", {		/* Bad $PIR */			MATCH(DMI_PRODUCT_NAME, "Dell PowerEdge 8450"),			NO_MATCH, NO_MATCH, NO_MATCH			} },				{ broken_acpi_Sx, "ASUS K7V-RM", {		/* Bad ACPI Sx table */			MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"),			MATCH(DMI_BOARD_NAME, "<K7V-RM>"),			NO_MATCH, NO_MATCH			} },				{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),			NO_MATCH, NO_MATCH, NO_MATCH			} },	{ init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),			NO_MATCH, NO_MATCH, NO_MATCH			} },	{ print_if_true, KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.", {			MATCH(DMI_SYS_VENDOR, "IBM"),			MATCH(DMI_BIOS_VERSION, "1AET38WW (1.01b)"),			NO_MATCH, NO_MATCH			} },	 	{ fix_broken_hp_bios_irq9, "HP Pavilion N5400 Series Laptop", {			MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),			MATCH(DMI_BIOS_VERSION, "GE.M1.03"),			MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),			MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736")			} }, 	/*	 *	Generic per vendor APM settings	 */	 	{ set_apm_ints, "IBM", {	/* Allow interrupts during suspend on IBM laptops */			MATCH(DMI_SYS_VENDOR, "IBM"),			NO_MATCH, NO_MATCH, NO_MATCH			} },	{ NULL, }};		/* *	Walk the blacklist table running matching functions until someone  *	returns 1 or we hit the end. */ static __init void dmi_check_blacklist(void){	struct dmi_blacklist *d;	int i;			d=&dmi_blacklist[0];	while(d->callback)	{		for(i=0;i<4;i++)		{			int s = d->matches[i].slot;			if(s==NONE)				continue;			if(dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr))				continue;			/* No match */			goto fail;		}		if(d->callback(d))			return;fail:					d++;	}}	/* *	Process a DMI table entry. Right now all we care about are the BIOS *	and machine entries. For 2.5 we should pull the smbus controller info *	out of here. */static void __init dmi_decode(struct dmi_header *dm){	u8 *data = (u8 *)dm;	char *p;		switch(dm->type)	{		case  0:			p=dmi_string(dm,data[4]);			if(*p)			{				dmi_printk(("BIOS Vendor: %s\n", p));				dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);				dmi_printk(("BIOS Version: %s\n", 					dmi_string(dm, data[5])));				dmi_save_ident(dm, DMI_BIOS_VERSION, 5);				dmi_printk(("BIOS Release: %s\n",					dmi_string(dm, data[8])));				dmi_save_ident(dm, DMI_BIOS_DATE, 8);			}			break;					case 1:			p=dmi_string(dm,data[4]);			if(*p)			{				dmi_printk(("System Vendor: %s.\n",p));				dmi_save_ident(dm, DMI_SYS_VENDOR, 4);				dmi_printk(("Product Name: %s.\n",					dmi_string(dm, data[5])));				dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);				dmi_printk(("Version %s.\n",					dmi_string(dm, data[6])));				dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);				dmi_printk(("Serial Number %s.\n",					dmi_string(dm, data[7])));			}			break;		case 2:			p=dmi_string(dm,data[4]);			if(*p)			{				dmi_printk(("Board Vendor: %s.\n",p));				dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);				dmi_printk(("Board Name: %s.\n",					dmi_string(dm, data[5])));				dmi_save_ident(dm, DMI_BOARD_NAME, 5);				dmi_printk(("Board Version: %s.\n",					dmi_string(dm, data[6])));				dmi_save_ident(dm, DMI_BOARD_VERSION, 6);			}			break;		case 3:			p=dmi_string(dm,data[8]);			if(*p && *p!=' ')				dmi_printk(("Asset Tag: %s.\n", p));			break;	}}void __init dmi_scan_machine(void){	int err = dmi_iterate(dmi_decode);	if(err == 0)		dmi_check_blacklist();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?