Merge branch 'x86/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jaswinder/linux-2.6-tip into x86/cleanups
This commit is contained in:
@@ -282,6 +282,14 @@ static void skip_entry(unsigned char **ptr, int *count, int size)
|
|||||||
*count += size;
|
*count += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt)
|
||||||
|
{
|
||||||
|
printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"
|
||||||
|
"type %x\n", *mpt);
|
||||||
|
print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16,
|
||||||
|
1, mpc, mpc->length, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
|
static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
|
||||||
{
|
{
|
||||||
char str[16];
|
char str[16];
|
||||||
@@ -340,10 +348,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* wrong mptable */
|
/* wrong mptable */
|
||||||
printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n");
|
smp_dump_mptable(mpc, mpt);
|
||||||
printk(KERN_ERR "type %x\n", *mpt);
|
|
||||||
print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16,
|
|
||||||
1, mpc, mpc->length, 1);
|
|
||||||
count = mpc->length;
|
count = mpc->length;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -550,6 +555,55 @@ static unsigned long __init get_mpc_size(unsigned long physptr)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init check_physptr(struct mpf_intel *mpf, unsigned int early)
|
||||||
|
{
|
||||||
|
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(mpc, early)) {
|
||||||
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
|
smp_found_config = 0;
|
||||||
|
#endif
|
||||||
|
printk(KERN_ERR "BIOS bug, MP table errors detected!...\n"
|
||||||
|
"... disabling SMP support. (tell your hw vendor)\n");
|
||||||
|
early_iounmap(mpc, size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
early_iounmap(mpc, size);
|
||||||
|
|
||||||
|
if (early)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
|
/*
|
||||||
|
* If there are no explicit MP IRQ entries, then we are
|
||||||
|
* broken. We set up most of the low 16 IO-APIC pins to
|
||||||
|
* ISA defaults and hope it will work.
|
||||||
|
*/
|
||||||
|
if (!mp_irq_entries) {
|
||||||
|
struct mpc_bus bus;
|
||||||
|
|
||||||
|
printk(KERN_ERR "BIOS bug, no explicit IRQ entries, "
|
||||||
|
"using default mptable. (tell your hw vendor)\n");
|
||||||
|
|
||||||
|
bus.type = MP_BUS;
|
||||||
|
bus.busid = 0;
|
||||||
|
memcpy(bus.bustype, "ISA ", 6);
|
||||||
|
MP_bus_info(&bus);
|
||||||
|
|
||||||
|
construct_default_ioirq_mptable(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan the memory blocks for an SMP configuration block.
|
* Scan the memory blocks for an SMP configuration block.
|
||||||
*/
|
*/
|
||||||
@@ -603,51 +657,8 @@ static void __init __get_smp_config(unsigned int early)
|
|||||||
construct_default_ISA_mptable(mpf->feature1);
|
construct_default_ISA_mptable(mpf->feature1);
|
||||||
|
|
||||||
} else if (mpf->physptr) {
|
} else if (mpf->physptr) {
|
||||||
struct mpc_table *mpc;
|
if (check_physptr(mpf, early))
|
||||||
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(mpc, early)) {
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
|
||||||
smp_found_config = 0;
|
|
||||||
#endif
|
|
||||||
printk(KERN_ERR
|
|
||||||
"BIOS bug, MP table errors detected!...\n");
|
|
||||||
printk(KERN_ERR "... disabling SMP support. "
|
|
||||||
"(tell your hw vendor)\n");
|
|
||||||
early_iounmap(mpc, size);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
early_iounmap(mpc, size);
|
|
||||||
|
|
||||||
if (early)
|
|
||||||
return;
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
|
||||||
/*
|
|
||||||
* If there are no explicit MP IRQ entries, then we are
|
|
||||||
* broken. We set up most of the low 16 IO-APIC pins to
|
|
||||||
* ISA defaults and hope it will work.
|
|
||||||
*/
|
|
||||||
if (!mp_irq_entries) {
|
|
||||||
struct mpc_bus bus;
|
|
||||||
|
|
||||||
printk(KERN_ERR "BIOS bug, no explicit IRQ entries, "
|
|
||||||
"using default mptable. "
|
|
||||||
"(tell your hw vendor)\n");
|
|
||||||
|
|
||||||
bus.type = MP_BUS;
|
|
||||||
bus.busid = 0;
|
|
||||||
memcpy(bus.bustype, "ISA ", 6);
|
|
||||||
MP_bus_info(&bus);
|
|
||||||
|
|
||||||
construct_default_ioirq_mptable(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else
|
} else
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
@@ -910,10 +921,7 @@ static int __init replace_intsrc_all(struct mpc_table *mpc,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* wrong mptable */
|
/* wrong mptable */
|
||||||
printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n");
|
smp_dump_mptable(mpc, mpt);
|
||||||
printk(KERN_ERR "type %x\n", *mpt);
|
|
||||||
print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16,
|
|
||||||
1, mpc, mpc->length, 1);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user