Commit 8d4dd919 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar
Browse files

x86: ioremap mptable



Impact: fix boot with mptable above max_low_mapped

Try to use early_ioremap() to map MPC to make sure it works even it is
at the end of ram.

Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <49AE4901.3090801@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Reported-and-tested-by: default avatarKevin O'Connor <kevin@koconnor.net>
parent b68adb16
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -558,6 +558,19 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type)

static struct mpf_intel *mpf_found;

static unsigned long __init get_mpc_size(unsigned long physptr)
{
	struct mpc_table *mpc;
	unsigned long size;

	mpc = early_ioremap(physptr, PAGE_SIZE);
	size = mpc->length;
	early_iounmap(mpc, PAGE_SIZE);
	apic_printk(APIC_VERBOSE, "  mpc: %lx-%lx\n", physptr, physptr + size);

	return size;
}

/*
 * Scan the memory blocks for an SMP configuration block.
 */
@@ -611,12 +624,16 @@ static void __init __get_smp_config(unsigned int early)
		construct_default_ISA_mptable(mpf->feature1);

	} else if (mpf->physptr) {
		struct mpc_table *mpc;
		unsigned long size;

		size = get_mpc_size(mpf->physptr);
		mpc = early_ioremap(mpf->physptr, size);
		/*
		 * Read the physical hardware table.  Anything here will
		 * override the defaults.
		 */
		if (!smp_read_mpc(phys_to_virt(mpf->physptr), early)) {
		if (!smp_read_mpc(mpc, early)) {
#ifdef CONFIG_X86_LOCAL_APIC
			smp_found_config = 0;
#endif
@@ -624,8 +641,10 @@ static void __init __get_smp_config(unsigned int early)
			       "BIOS bug, MP table errors detected!...\n");
			printk(KERN_ERR "... disabling SMP support. "
			       "(tell your hw vendor)\n");
			early_iounmap(mpc, size);
			return;
		}
		early_iounmap(mpc, size);

		if (early)
			return;