lkml.org 
[lkml]   [2009]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/18] xen/apic: identity map gsi->irqs
    Date
    From: Jeremy Fitzhardinge <jeremy@f9-builder.(none)>

    Impact: preserve compat with native

    Reserve the lower irq range for use for hardware interrupts so we
    can identity-map them.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    ---
    drivers/xen/events.c | 23 +++++++++++++++++------
    1 files changed, 17 insertions(+), 6 deletions(-)

    diff --git a/drivers/xen/events.c b/drivers/xen/events.c
    index a917ebe..193cee4 100644
    --- a/drivers/xen/events.c
    +++ b/drivers/xen/events.c
    @@ -31,6 +31,7 @@
    #include <asm/ptrace.h>
    #include <asm/irq.h>
    #include <asm/idle.h>
    +#include <asm/io_apic.h>
    #include <asm/sync_bitops.h>
    #include <asm/xen/hypercall.h>
    #include <asm/xen/hypervisor.h>
    @@ -40,9 +41,6 @@
    #include <xen/interface/xen.h>
    #include <xen/interface/event_channel.h>

    -/* Leave low irqs free for identity mapping */
    -#define LEGACY_IRQS 16
    -
    /*
    * This lock protects updates to the following mapping and reference-count
    * arrays. The lock does not need to be acquired to read the mapping tables.
    @@ -344,12 +342,24 @@ static void unmask_evtchn(int port)
    put_cpu();
    }

    +static int get_nr_hw_irqs(void)
    +{
    + int ret = 1;
    +
    +#ifdef CONFIG_X86_IO_APIC
    + ret = get_nr_irqs_gsi();
    +#endif
    +
    + return ret;
    +}
    +
    static int find_unbound_irq(void)
    {
    int irq;
    struct irq_desc *desc;
    + int start = get_nr_hw_irqs();

    - for (irq = LEGACY_IRQS; irq < nr_irqs; irq++)
    + for (irq = start; irq < nr_irqs; irq++)
    if (irq_info[irq].type == IRQT_UNBOUND)
    break;

    @@ -367,8 +377,8 @@ static int find_unbound_irq(void)

    static bool identity_mapped_irq(unsigned irq)
    {
    - /* only identity map legacy irqs */
    - return irq < LEGACY_IRQS;
    + /* identity map all the hardware irqs */
    + return irq < get_nr_hw_irqs();
    }

    static void pirq_unmask_notify(int irq)
    @@ -537,6 +547,7 @@ int xen_allocate_pirq(unsigned gsi)

    if (identity_mapped_irq(gsi)) {
    irq = gsi;
    + irq_to_desc_alloc_cpu(irq, 0);
    dynamic_irq_init(irq);
    } else
    irq = find_unbound_irq();
    --
    1.6.0.6


    \
     
     \ /
      Last update: 2009-05-08 02:17    [W:0.025 / U:0.504 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site