⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		error = acpi_parse_madt_lapic_entries();		if (!error) {			acpi_lapic = 1;#ifdef CONFIG_X86_GENERICARCH			generic_bigsmp_probe();#endif			/*			 * Parse MADT IO-APIC entries			 */			error = acpi_parse_madt_ioapic_entries();			if (!error) {				acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;				acpi_irq_balance_set(NULL);				acpi_ioapic = 1;				smp_found_config = 1;				setup_apic_routing();			}		}		if (error == -EINVAL) {			/*			 * Dell Precision Workstation 410, 610 come here.			 */			printk(KERN_ERR PREFIX			       "Invalid BIOS MADT, disabling ACPI\n");			disable_acpi();		}	}#endif	return;}#ifdef __i386__static int __init disable_acpi_irq(const struct dmi_system_id *d){	if (!acpi_force) {		printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",		       d->ident);		acpi_noirq_set();	}	return 0;}static int __init disable_acpi_pci(const struct dmi_system_id *d){	if (!acpi_force) {		printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",		       d->ident);		acpi_disable_pci();	}	return 0;}static int __init dmi_disable_acpi(const struct dmi_system_id *d){	if (!acpi_force) {		printk(KERN_NOTICE "%s detected: acpi off\n", d->ident);		disable_acpi();	} else {		printk(KERN_NOTICE		       "Warning: DMI blacklist says broken, but acpi forced\n");	}	return 0;}/* * Limit ACPI to CPU enumeration for HT */static int __init force_acpi_ht(const struct dmi_system_id *d){	if (!acpi_force) {		printk(KERN_NOTICE "%s detected: force use of acpi=ht\n",		       d->ident);		disable_acpi();		acpi_ht = 1;	} else {		printk(KERN_NOTICE		       "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");	}	return 0;}/* * If your system is blacklisted here, but you find that acpi=force * works for you, please contact acpi-devel@sourceforge.net */static struct dmi_system_id __initdata acpi_dmi_table[] = {	/*	 * Boxes that need ACPI disabled	 */	{	 .callback = dmi_disable_acpi,	 .ident = "IBM Thinkpad",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),		     },	 },	/*	 * Boxes that need acpi=ht	 */	{	 .callback = force_acpi_ht,	 .ident = "FSC Primergy T850",	 .matches = {		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),		     DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "HP VISUALIZE NT Workstation",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),		     DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "Compaq Workstation W8000",	 .matches = {		     DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),		     DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "ASUS P4B266",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),		     DMI_MATCH(DMI_BOARD_NAME, "P4B266"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "ASUS P2B-DS",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),		     DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "ASUS CUR-DLS",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),		     DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "ABIT i440BX-W83977",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),		     DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "IBM Bladecenter",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "IBM eServer xSeries 360",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "IBM eserver xSeries 330",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),		     },	 },	{	 .callback = force_acpi_ht,	 .ident = "IBM eserver xSeries 440",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),		     },	 },	/*	 * Boxes that need ACPI PCI IRQ routing disabled	 */	{	 .callback = disable_acpi_irq,	 .ident = "ASUS A7V",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),		     DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),		     /* newer BIOS, Revision 1011, does work */		     DMI_MATCH(DMI_BIOS_VERSION,			       "ASUS A7V ACPI BIOS Revision 1007"),		     },	 },	{		/*		 * Latest BIOS for IBM 600E (1.16) has bad pcinum		 * for LPC bridge, which is needed for the PCI		 * interrupt links to work. DSDT fix is in bug 5966.		 * 2645, 2646 model numbers are shared with 600/600E/600X		 */	 .callback = disable_acpi_irq,	 .ident = "IBM Thinkpad 600 Series 2645",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "2645"),		     },	 },	{	 .callback = disable_acpi_irq,	 .ident = "IBM Thinkpad 600 Series 2646",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),		     DMI_MATCH(DMI_BOARD_NAME, "2646"),		     },	 },	/*	 * Boxes that need ACPI PCI IRQ routing and PCI scan disabled	 */	{			/* _BBN 0 bug */	 .callback = disable_acpi_pci,	 .ident = "ASUS PR-DLS",	 .matches = {		     DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),		     DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),		     DMI_MATCH(DMI_BIOS_VERSION,			       "ASUS PR-DLS ACPI BIOS Revision 1010"),		     DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")		     },	 },	{	 .callback = disable_acpi_pci,	 .ident = "Acer TravelMate 36x Laptop",	 .matches = {		     DMI_MATCH(DMI_SYS_VENDOR, "Acer"),		     DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),		     },	 },	{}};#endif				/* __i386__ *//* * acpi_boot_table_init() and acpi_boot_init() *  called from setup_arch(), always. *	1. checksums all tables *	2. enumerates lapics *	3. enumerates io-apics * * acpi_table_init() is separate to allow reading SRAT without * other side effects. * * side effects of acpi_boot_init: *	acpi_lapic = 1 if LAPIC found *	acpi_ioapic = 1 if IOAPIC found *	if (acpi_lapic && acpi_ioapic) smp_found_config = 1; *	if acpi_blacklisted() acpi_disabled = 1; *	acpi_irq_model=... *	... * * return value: (currently ignored) *	0: success *	!0: failure */int __init acpi_boot_table_init(void){	int error;#ifdef __i386__	dmi_check_system(acpi_dmi_table);#endif	/*	 * If acpi_disabled, bail out	 * One exception: acpi=ht continues far enough to enumerate LAPICs	 */	if (acpi_disabled && !acpi_ht)		return 1;	/*	 * Initialize the ACPI boot-time table parser.	 */	error = acpi_table_init();	if (error) {		disable_acpi();		return error;	}	acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);	/*	 * blacklist may disable ACPI entirely	 */	error = acpi_blacklisted();	if (error) {		if (acpi_force) {			printk(KERN_WARNING PREFIX "acpi=force override\n");		} else {			printk(KERN_WARNING PREFIX "Disabling ACPI support\n");			disable_acpi();			return error;		}	}	return 0;}int __init acpi_boot_init(void){	/*	 * If acpi_disabled, bail out	 * One exception: acpi=ht continues far enough to enumerate LAPICs	 */	if (acpi_disabled && !acpi_ht)		return 1;	acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);	/*	 * set sci_int and PM timer address	 */	acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt);	/*	 * Process the Multiple APIC Description Table (MADT), if present	 */	acpi_process_madt();	acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);	return 0;}static int __init parse_acpi(char *arg){	if (!arg)		return -EINVAL;	/* "acpi=off" disables both ACPI table parsing and interpreter */	if (strcmp(arg, "off") == 0) {		disable_acpi();	}	/* acpi=force to over-ride black-list */	else if (strcmp(arg, "force") == 0) {		acpi_force = 1;		acpi_ht = 1;		acpi_disabled = 0;	}	/* acpi=strict disables out-of-spec workarounds */	else if (strcmp(arg, "strict") == 0) {		acpi_strict = 1;	}	/* Limit ACPI just to boot-time to enable HT */	else if (strcmp(arg, "ht") == 0) {		if (!acpi_force)			disable_acpi();		acpi_ht = 1;	}	/* "acpi=noirq" disables ACPI interrupt routing */	else if (strcmp(arg, "noirq") == 0) {		acpi_noirq_set();	} else {		/* Core will printk when we return error. */		return -EINVAL;	}	return 0;}early_param("acpi", parse_acpi);/* FIXME: Using pci= for an ACPI parameter is a travesty. */static int __init parse_pci(char *arg){	if (arg && strcmp(arg, "noacpi") == 0)		acpi_disable_pci();	return 0;}early_param("pci", parse_pci);#ifdef CONFIG_X86_IO_APICstatic int __init parse_acpi_skip_timer_override(char *arg){	acpi_skip_timer_override = 1;	return 0;}early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override);static int __init parse_acpi_use_timer_override(char *arg){	acpi_use_timer_override = 1;	return 0;}early_param("acpi_use_timer_override", parse_acpi_use_timer_override);#endif /* CONFIG_X86_IO_APIC */static int __init setup_acpi_sci(char *s){	if (!s)		return -EINVAL;	if (!strcmp(s, "edge"))		acpi_sci_flags =  ACPI_MADT_TRIGGER_EDGE |			(acpi_sci_flags & ~ACPI_MADT_TRIGGER_MASK);	else if (!strcmp(s, "level"))		acpi_sci_flags = ACPI_MADT_TRIGGER_LEVEL |			(acpi_sci_flags & ~ACPI_MADT_TRIGGER_MASK);	else if (!strcmp(s, "high"))		acpi_sci_flags = ACPI_MADT_POLARITY_ACTIVE_HIGH |			(acpi_sci_flags & ~ACPI_MADT_POLARITY_MASK);	else if (!strcmp(s, "low"))		acpi_sci_flags = ACPI_MADT_POLARITY_ACTIVE_LOW |			(acpi_sci_flags & ~ACPI_MADT_POLARITY_MASK);	else		return -EINVAL;	return 0;}early_param("acpi_sci", setup_acpi_sci);int __acpi_acquire_global_lock(unsigned int *lock){	unsigned int old, new, val;	do {		old = *lock;		new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));		val = cmpxchg(lock, old, new);	} while (unlikely (val != old));	return (new < 3) ? -1 : 0;}int __acpi_release_global_lock(unsigned int *lock){	unsigned int old, new, val;	do {		old = *lock;		new = old & ~0x3;		val = cmpxchg(lock, old, new);	} while (unlikely (val != old));	return old & 0x1;}

⌨️ 快捷键说明

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