x86, ioapic: Teach mp_register_ioapic to compute a global gsi_end
Add the global variable gsi_end and teach mp_register_ioapic to keep it uptodate as we add more ioapics into the system. ioapics can only be added early in boot so the code that runs later can treat gsi_end as a constant. Remove the have hacks in sfi.c to second guess mp_register_ioapic by keeping t's own running total of how many gsi's have been seen, and instead use the gsi_end. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> LKML-Reference: <1269936436-7039-9-git-send-email-ebiederm@xmission.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
eddb0c55a1
commit
5777372af5
|
@ -184,6 +184,7 @@ struct mp_ioapic_gsi{
|
|||
u32 gsi_end;
|
||||
};
|
||||
extern struct mp_ioapic_gsi mp_gsi_routing[];
|
||||
extern u32 gsi_end;
|
||||
int mp_find_ioapic(u32 gsi);
|
||||
int mp_find_ioapic_pin(int ioapic, u32 gsi);
|
||||
void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
|
||||
|
|
|
@ -89,6 +89,9 @@ int nr_ioapics;
|
|||
/* IO APIC gsi routing info */
|
||||
struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS];
|
||||
|
||||
/* The last gsi number used */
|
||||
u32 gsi_end;
|
||||
|
||||
/* MP IRQ source entries */
|
||||
struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||
|
||||
|
@ -4312,6 +4315,9 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
|
|||
mp_gsi_routing[idx].gsi_end = gsi_base +
|
||||
io_apic_get_redir_entries(idx) - 1;
|
||||
|
||||
if (mp_gsi_routing[idx].gsi_end > gsi_end)
|
||||
gsi_end = mp_gsi_routing[idx].gsi_end;
|
||||
|
||||
printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
|
||||
"GSI %d-%d\n", idx, mp_ioapics[idx].apicid,
|
||||
mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr,
|
||||
|
|
|
@ -81,7 +81,6 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table)
|
|||
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
static u32 gsi_base;
|
||||
|
||||
static int __init sfi_parse_ioapic(struct sfi_table_header *table)
|
||||
{
|
||||
|
@ -94,8 +93,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table)
|
|||
pentry = (struct sfi_apic_table_entry *)sb->pentry;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
mp_register_ioapic(i, pentry->phys_addr, gsi_base);
|
||||
gsi_base += io_apic_get_redir_entries(i);
|
||||
mp_register_ioapic(i, pentry->phys_addr, gsi_end + 1);
|
||||
pentry++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue