Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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=1641



Acked-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 28e8351a
Loading
Loading
Loading
Loading
+6 −9
Original line number Original line Diff line number Diff line
@@ -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


	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.


+0 −8
Original line number Original line Diff line number Diff line
@@ -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;
+3 −5
Original line number Original line Diff line number Diff line
@@ -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)
+0 −1
Original line number Original line Diff line number Diff line
@@ -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
+6 −0
Original line number Original line Diff line number Diff line
@@ -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.
Loading