x86, ioapic: In mpparse use mp_register_ioapic
Long ago MP_ioapic_info was the primary way of setting up our ioapic data structures and mp_register_ioapic was a compatibility shim for acpi code. Now the situation is reversed and and mp_register_ioapic is the primary way of setting up our ioapic data structures. Keep the setting up of ioapic data structures uniform by having mp_register_ioapic call mp_register_ioapic. This changes a few fields: - type: is now hardset to MP_IOAPIC but type had to bey MP_IOAPIC or MP_ioapic_info would not have been called. - flags: is now hard coded to MPC_APIC_USABLE. We require flags to contain at least MPC_APIC_USEBLE in MP_ioapic_info and we don't ever examine flags so dropping a few flags that might possibly exist that we have never used is harmless. - apicaddr: Unchanged - apicver: Read from the ioapic instead of using the cached hardware value in the MP table. The real hardware value will be more accurate. - apicid: Now verified to be unique and changed if it is not. If the BIOS got this right this is a noop. If the BIOS did not fixing things appears to be the better solution. This adds gsi_base and gsi_end values to our ioapics defined with the mpatable, which will make our lives simpler later since we can always assume gsi_base and gsi_end are valid. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> LKML-Reference: <1269936436-7039-10-git-send-email-ebiederm@xmission.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
Родитель
5777372af5
Коммит
cf7500c0ea
|
@ -115,21 +115,6 @@ static void __init MP_bus_info(struct mpc_bus *m)
|
|||
printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
|
||||
}
|
||||
|
||||
static int bad_ioapic(unsigned long address)
|
||||
{
|
||||
if (nr_ioapics >= MAX_IO_APICS) {
|
||||
printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
|
||||
"(found %d)\n", MAX_IO_APICS, nr_ioapics);
|
||||
panic("Recompile kernel with bigger MAX_IO_APICS!\n");
|
||||
}
|
||||
if (!address) {
|
||||
printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
|
||||
" found in table, skipping!\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init MP_ioapic_info(struct mpc_ioapic *m)
|
||||
{
|
||||
if (!(m->flags & MPC_APIC_USABLE))
|
||||
|
@ -138,15 +123,7 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m)
|
|||
printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
|
||||
m->apicid, m->apicver, m->apicaddr);
|
||||
|
||||
if (bad_ioapic(m->apicaddr))
|
||||
return;
|
||||
|
||||
mp_ioapics[nr_ioapics].apicaddr = m->apicaddr;
|
||||
mp_ioapics[nr_ioapics].apicid = m->apicid;
|
||||
mp_ioapics[nr_ioapics].type = m->type;
|
||||
mp_ioapics[nr_ioapics].apicver = m->apicver;
|
||||
mp_ioapics[nr_ioapics].flags = m->flags;
|
||||
nr_ioapics++;
|
||||
mp_register_ioapic(m->apicid, m->apicaddr, gsi_end + 1);
|
||||
}
|
||||
|
||||
static void print_MP_intsrc_info(struct mpc_intsrc *m)
|
||||
|
|
Загрузка…
Ссылка в новой задаче