Commit 61ec7567 authored by Len Brown's avatar Len Brown

ACPI: boot correctly with "nosmp" or "maxcpus=0"

In MPS mode, "nosmp" and "maxcpus=0" boot a UP kernel with IOAPIC disabled.
However, in ACPI mode, these parameters didn't completely disable
the IO APIC initialization code and boot failed.

init/main.c:
	Disable the IO_APIC if "nosmp" or "maxcpus=0"
	undefine disable_ioapic_setup() when it doesn't apply.

i386:
	delete ioapic_setup(), it was a duplicate of parse_noapic()
	delete undefinition of disable_ioapic_setup()

x86_64:
	rename disable_ioapic_setup() to parse_noapic() to match i386
	define disable_ioapic_setup() in header to match i386

http://bugzilla.kernel.org/show_bug.cgi?id=1641Acked-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 28e8351a
...@@ -952,14 +952,10 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -952,14 +952,10 @@ and is between 256 and 4096 characters. It is defined in the file
Format: <1-256> Format: <1-256>
maxcpus= [SMP] Maximum number of processors that an SMP kernel maxcpus= [SMP] Maximum number of processors that an SMP kernel
should make use of. should make use of. maxcpus=n : n >= 0 limits the
Using "nosmp" or "maxcpus=0" will disable SMP kernel to using 'n' processors. n=0 is a special case,
entirely (the MPS table probe still happens, though). it is equivalent to "nosmp", which also disables
A command-line option of "maxcpus=<NUM>", where <NUM> the IO APIC.
is an integer greater than 0, limits the maximum number
of CPUs activated in SMP mode to <NUM>.
Using "maxcpus=1" on an SMP kernel is the trivial
case of an SMP kernel with only one CPU.
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
equal to this physical address is ignored. equal to this physical address is ignored.
...@@ -1184,7 +1180,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1184,7 +1180,8 @@ and is between 256 and 4096 characters. It is defined in the file
nosep [BUGS=X86-32] Disables x86 SYSENTER/SYSEXIT support. nosep [BUGS=X86-32] Disables x86 SYSENTER/SYSEXIT support.
nosmp [SMP] Tells an SMP kernel to act as a UP kernel. nosmp [SMP] Tells an SMP kernel to act as a UP kernel,
and disable the IO APIC. legacy for "maxcpus=0".
nosoftlockup [KNL] Disable the soft-lockup detector. nosoftlockup [KNL] Disable the soft-lockup detector.
......
...@@ -754,14 +754,6 @@ static int pirq_entries [MAX_PIRQS]; ...@@ -754,14 +754,6 @@ static int pirq_entries [MAX_PIRQS];
static int pirqs_enabled; static int pirqs_enabled;
int skip_ioapic_setup; int skip_ioapic_setup;
static int __init ioapic_setup(char *str)
{
skip_ioapic_setup = 1;
return 1;
}
__setup("noapic", ioapic_setup);
static int __init ioapic_pirq_setup(char *str) static int __init ioapic_pirq_setup(char *str)
{ {
int i, max; int i, max;
......
...@@ -397,14 +397,12 @@ static void clear_IO_APIC (void) ...@@ -397,14 +397,12 @@ static void clear_IO_APIC (void)
int skip_ioapic_setup; int skip_ioapic_setup;
int ioapic_force; int ioapic_force;
/* dummy parsing: see setup.c */ static int __init parse_noapic(char *str)
static int __init disable_ioapic_setup(char *str)
{ {
skip_ioapic_setup = 1; disable_ioapic_setup();
return 0; return 0;
} }
early_param("noapic", disable_ioapic_setup); early_param("noapic", parse_noapic);
/* Actually the next is obsolete, but keep it for paranoid reasons -AK */ /* Actually the next is obsolete, but keep it for paranoid reasons -AK */
static int __init disable_timer_pin_setup(char *arg) static int __init disable_timer_pin_setup(char *arg)
......
...@@ -150,7 +150,6 @@ extern int (*ioapic_renumber_irq)(int ioapic, int irq); ...@@ -150,7 +150,6 @@ extern int (*ioapic_renumber_irq)(int ioapic, int irq);
#else /* !CONFIG_X86_IO_APIC */ #else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0 #define io_apic_assign_pci_irqs 0
static inline void disable_ioapic_setup(void) { }
#endif #endif
#endif #endif
...@@ -109,6 +109,12 @@ extern int mpc_default_type; ...@@ -109,6 +109,12 @@ extern int mpc_default_type;
/* 1 if "noapic" boot option passed */ /* 1 if "noapic" boot option passed */
extern int skip_ioapic_setup; extern int skip_ioapic_setup;
static inline void disable_ioapic_setup(void)
{
skip_ioapic_setup = 1;
}
/* /*
* If we use the IO-APIC for IRQ routing, disable automatic * If we use the IO-APIC for IRQ routing, disable automatic
* assignment of PCI IRQ's. * assignment of PCI IRQ's.
......
...@@ -146,9 +146,14 @@ static unsigned int __initdata max_cpus = NR_CPUS; ...@@ -146,9 +146,14 @@ static unsigned int __initdata max_cpus = NR_CPUS;
* greater than 0, limits the maximum number of CPUs activated in * greater than 0, limits the maximum number of CPUs activated in
* SMP mode to <NUM>. * SMP mode to <NUM>.
*/ */
#ifndef CONFIG_X86_IO_APIC
static inline void disable_ioapic_setup(void) {};
#endif
static int __init nosmp(char *str) static int __init nosmp(char *str)
{ {
max_cpus = 0; max_cpus = 0;
disable_ioapic_setup();
return 0; return 0;
} }
...@@ -157,10 +162,13 @@ early_param("nosmp", nosmp); ...@@ -157,10 +162,13 @@ early_param("nosmp", nosmp);
static int __init maxcpus(char *str) static int __init maxcpus(char *str)
{ {
get_option(&str, &max_cpus); get_option(&str, &max_cpus);
return 1; if (max_cpus == 0)
disable_ioapic_setup();
return 0;
} }
__setup("maxcpus=", maxcpus); early_param("maxcpus=", maxcpus);
#else #else
#define max_cpus NR_CPUS #define max_cpus NR_CPUS
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment