lkml.org 
[lkml]   [2010]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/irq] x86, ioapic: Teach mp_register_ioapic to compute a global gsi_end
    Commit-ID:  5777372af5c929b8f3c706ed7b295b7279537c88
    Gitweb: http://git.kernel.org/tip/5777372af5c929b8f3c706ed7b295b7279537c88
    Author: Eric W. Biederman <ebiederm@xmission.com>
    AuthorDate: Tue, 30 Mar 2010 01:07:10 -0700
    Committer: H. Peter Anvin <hpa@zytor.com>
    CommitDate: Tue, 4 May 2010 13:34:56 -0700

    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>
    ---
    arch/x86/include/asm/io_apic.h | 1 +
    arch/x86/kernel/apic/io_apic.c | 6 ++++++
    arch/x86/kernel/sfi.c | 4 +---
    3 files changed, 8 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
    index feeaf0d..37b0f2b 100644
    --- a/arch/x86/include/asm/io_apic.h
    +++ b/arch/x86/include/asm/io_apic.h
    @@ -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);
    diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
    index 9ab9762..f807255 100644
    --- a/arch/x86/kernel/apic/io_apic.c
    +++ b/arch/x86/kernel/apic/io_apic.c
    @@ -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,
    diff --git a/arch/x86/kernel/sfi.c b/arch/x86/kernel/sfi.c
    index 34e0993..7ded578 100644
    --- a/arch/x86/kernel/sfi.c
    +++ b/arch/x86/kernel/sfi.c
    @@ -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++;
    }


    \
     
     \ /
      Last update: 2010-05-05 04:11    [W:0.065 / U:59.388 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site