]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branches 'irq/sparseirq', 'irq/genirq' and 'irq/urgent'; commit 'v2.6.28' into...
authorIngo Molnar <mingo@elte.hu>
Thu, 25 Dec 2008 15:27:54 +0000 (16:27 +0100)
committerIngo Molnar <mingo@elte.hu>
Thu, 25 Dec 2008 15:27:54 +0000 (16:27 +0100)
1  2  3  4 
arch/x86/kernel/setup.c
include/linux/irq.h
kernel/irq/chip.c

diff --combined arch/x86/kernel/setup.c
index 9d5674f7b6ccbfbdef7f5ad16901f9dc9dc08ad0,a3834f1232063aaf786196005dd4d42be3535395,9d5674f7b6ccbfbdef7f5ad16901f9dc9dc08ad0,bdec76e5559433d77366b85535f0563451614501..5e028e1926ebf036ed2f7ce0dd6b35c01f96e240
@@@@@ -794,6 -794,6 -794,6 -794,9 +794,9 @@@@@ void __init setup_arch(char **cmdline_p
        printk(KERN_INFO "Command line: %s\n", boot_command_line);
    #endif
    
+++     /* VMI may relocate the fixmap; do this before touching ioremap area */
+++     vmi_init();
+++ 
        early_cpu_init();
        early_ioremap_init();
    
        check_efer();
    #endif
    
--- #if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
---     /*
---      * Must be before kernel pagetables are setup
---      * or fixmap area is touched.
---      */
---     vmi_init();
--- #endif
+++     /* Must be before kernel pagetables are setup */
+++     vmi_activate();
    
        /* after early param, so could get panic from serial */
        reserve_early_setup_data();
        ioapic_init_mappings();
    
        /* need to wait for io_apic is mapped */
- --    nr_irqs = probe_nr_irqs();
+ ++    probe_nr_irqs_gsi();
    
        kvm_guest_init();
    
diff --combined include/linux/irq.h
index 838a977885e19cd3f81f1cdcac604a082b2bd21e,7fa7f30fccb6cc72d06cb878999297d12a0ac4df,3dddfa703ebd95ab1253c56397104c2607f98e90,3dddfa703ebd95ab1253c56397104c2607f98e90..98564dc6447627f0d6c25033e3ba601db819daf1
@@@@@ -63,7 -63,8 -63,8 -63,8 +63,8 @@@@@ typedef       void (*irq_flow_handler_t)(unsi
    #define IRQ_MOVE_PENDING    0x00200000      /* need to re-target IRQ destination */
    #define IRQ_NO_BALANCING    0x00400000      /* IRQ is excluded from balancing */
    #define IRQ_SPURIOUS_DISABLED       0x00800000      /* IRQ was disabled by the spurious trap */
-   #define IRQ_MOVE_PCNTXT     0x01000000      /* IRQ migration from process context */
+   #define IRQ_MOVE_PCNTXT             0x01000000      /* IRQ migration from process context */
+   #define IRQ_AFFINITY_SET    0x02000000      /* IRQ affinity was set from userspace*/
    
    #ifdef CONFIG_IRQ_PER_CPU
    # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
@@@@@ -128,9 -129,14 -129,9 -129,9 +129,14 @@@@@ struct irq_chip 
        const char      *typename;
    };
    
+ ++struct timer_rand_state;
+ ++struct irq_2_iommu;
    /**
     * struct irq_desc - interrupt descriptor
-    *
+    * @irq:            interrupt number for this descriptor
+ ++ * @timer_rand_state:       pointer to timer rand state struct
+ ++ * @kstat_irqs:             irq stats per cpu
+ ++ * @irq_2_iommu:    iommu with this irq
     * @handle_irq:             highlevel irq-events handler [if NULL, __do_IRQ()]
     * @chip:           low level interrupt hardware access
     * @msi_desc:               MSI descriptor
     * @depth:          disable-depth, for nested irq_disable() calls
     * @wake_depth:             enable depth, for multiple set_irq_wake() callers
     * @irq_count:              stats field to detect stalled irqs
 --- * @irqs_unhandled: stats field for spurious unhandled interrupts
     * @last_unhandled: aging timer for unhandled count
 +++ * @irqs_unhandled: stats field for spurious unhandled interrupts
     * @lock:           locking for SMP
     * @affinity:               IRQ affinity on SMP
     * @cpu:            cpu index useful for balancing
     * @pending_mask:   pending rebalanced interrupts
     * @dir:            /proc/irq/ procfs entry
-    * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP
     * @name:           flow handler name for /proc/interrupts output
     */
    struct irq_desc {
        unsigned int            irq;
+ ++#ifdef CONFIG_SPARSE_IRQ
+ ++    struct timer_rand_state *timer_rand_state;
+ ++    unsigned int            *kstat_irqs;
+ ++# ifdef CONFIG_INTR_REMAP
+ ++    struct irq_2_iommu      *irq_2_iommu;
+ ++# endif
+ ++#endif
        irq_flow_handler_t      handle_irq;
        struct irq_chip         *chip;
        struct msi_desc         *msi_desc;
        unsigned int            depth;          /* nested irq disables */
        unsigned int            wake_depth;     /* nested wake enables */
        unsigned int            irq_count;      /* For detecting broken IRQs */
 ---    unsigned int            irqs_unhandled;
        unsigned long           last_unhandled; /* Aging timer for unhandled count */
 +++    unsigned int            irqs_unhandled;
        spinlock_t              lock;
    #ifdef CONFIG_SMP
        cpumask_t               affinity;
        const char              *name;
    } ____cacheline_internodealigned_in_smp;
    
+ ++extern void early_irq_init(void);
+ ++extern void arch_early_irq_init(void);
+ ++extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
+ ++extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ ++                                    struct irq_desc *desc, int cpu);
+ ++extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
    
+ ++#ifndef CONFIG_SPARSE_IRQ
    extern struct irq_desc irq_desc[NR_IRQS];
    
    static inline struct irq_desc *irq_to_desc(unsigned int irq)
    {
- --    return (irq < nr_irqs) ? irq_desc + irq : NULL;
+ ++    return (irq < NR_IRQS) ? irq_desc + irq : NULL;
+ ++}
+ ++static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+ ++{
+ ++    return irq_to_desc(irq);
+ ++}
+ ++
+ ++#else
+ ++
+ ++extern struct irq_desc *irq_to_desc(unsigned int irq);
+ ++extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
+ ++extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
+ ++
+ ++# define for_each_irq_desc(irq, desc)               \
+ ++    for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; irq++, desc = irq_to_desc(irq))
+ ++# define for_each_irq_desc_reverse(irq, desc)                          \
+ ++    for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; irq--, desc = irq_to_desc(irq))
+ ++
+ ++#define kstat_irqs_this_cpu(DESC) \
+ ++    ((DESC)->kstat_irqs[smp_processor_id()])
+ ++#define kstat_incr_irqs_this_cpu(irqno, DESC) \
+ ++    ((DESC)->kstat_irqs[smp_processor_id()]++)
+ ++
+ ++#endif
+ ++
+ ++static inline struct irq_desc *
+ ++irq_remap_to_desc(unsigned int irq, struct irq_desc *desc)
+ ++{
+ ++#ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC
+ ++    return irq_to_desc(irq);
+ ++#else
+ ++    return desc;
+ ++#endif
    }
    
    /*
@@@@@ -210,7 -261,6 -210,6 -210,6 +261,6 @@@@@ extern int setup_irq(unsigned int irq, 
    
    #ifdef CONFIG_GENERIC_PENDING_IRQ
    
-   void set_pending_irq(unsigned int irq, cpumask_t mask);
    void move_native_irq(int irq);
    void move_masked_irq(int irq);
    
@@@@@ -228,10 -278,6 -227,6 -227,6 +278,6 @@@@@ static inline void move_masked_irq(int 
    {
    }
    
-   static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
-   {
-   }
-   
    #endif /* CONFIG_GENERIC_PENDING_IRQ */
    
    #else /* CONFIG_SMP */
@@@@@ -385,6 -431,11 -380,6 -380,6 +431,11 @@@@@ extern int set_irq_msi(unsigned int irq
    #define get_irq_data(irq)   (irq_to_desc(irq)->handler_data)
    #define get_irq_msi(irq)    (irq_to_desc(irq)->msi_desc)
    
+ ++#define get_irq_desc_chip(desc)             ((desc)->chip)
+ ++#define get_irq_desc_chip_data(desc)        ((desc)->chip_data)
+ ++#define get_irq_desc_data(desc)             ((desc)->handler_data)
+ ++#define get_irq_desc_msi(desc)              ((desc)->msi_desc)
+ ++
    #endif /* CONFIG_GENERIC_HARDIRQS */
    
    #endif /* !CONFIG_S390 */
diff --combined kernel/irq/chip.c
index 10b5092e9bfe749da57b2ab408e3f6d38ae81d75,de210f4b7a929b9cb911d13c4eee2b23679c5fdd,7765d4c80c30ed434a0f2328551349f1ed2ae78b,10b5092e9bfe749da57b2ab408e3f6d38ae81d75..6eb3c7952b6496fc9c5f8da49b982d79866e1504
     */
    void dynamic_irq_init(unsigned int irq)
    {
- --    struct irq_desc *desc = irq_to_desc(irq);
+ ++    struct irq_desc *desc;
        unsigned long flags;
    
+ ++    desc = irq_to_desc(irq);
        if (!desc) {
                WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
                return;
@@@@@ -124,6 -125,6 -124,7 -124,6 +125,7 @@@@@ int set_irq_type(unsigned int irq, unsi
                return -ENODEV;
        }
    
++ +    type &= IRQ_TYPE_SENSE_MASK;
        if (type == IRQ_TYPE_NONE)
                return 0;
    
@@@@@ -352,6 -353,7 -353,6 -352,6 +354,7 @@@@@ handle_level_irq(unsigned int irq, stru
    
        spin_lock(&desc->lock);
        mask_ack_irq(desc, irq);
+ ++    desc = irq_remap_to_desc(irq, desc);
    
        if (unlikely(desc->status & IRQ_INPROGRESS))
                goto out_unlock;
@@@@@ -429,6 -431,7 -430,6 -429,6 +432,7 @@@@@ handle_fasteoi_irq(unsigned int irq, st
        desc->status &= ~IRQ_INPROGRESS;
    out:
        desc->chip->eoi(irq);
+ ++    desc = irq_remap_to_desc(irq, desc);
    
        spin_unlock(&desc->lock);
    }
@@@@@ -465,12 -468,14 -466,12 -465,12 +469,14 @@@@@ handle_edge_irq(unsigned int irq, struc
                    !desc->action)) {
                desc->status |= (IRQ_PENDING | IRQ_MASKED);
                mask_ack_irq(desc, irq);
+ ++            desc = irq_remap_to_desc(irq, desc);
                goto out_unlock;
        }
        kstat_incr_irqs_this_cpu(irq, desc);
    
        /* Start handling the irq */
        desc->chip->ack(irq);
+ ++    desc = irq_remap_to_desc(irq, desc);
    
        /* Mark the IRQ currently in progress.*/
        desc->status |= IRQ_INPROGRESS;
@@@@@ -531,8 -536,10 -532,8 -531,8 +537,10 @@@@@ handle_percpu_irq(unsigned int irq, str
        if (!noirqdebug)
                note_interrupt(irq, desc, action_ret);
    
- --    if (desc->chip->eoi)
+ ++    if (desc->chip->eoi) {
                desc->chip->eoi(irq);
+ ++            desc = irq_remap_to_desc(irq, desc);
+ ++    }
    }
    
    void
@@@@@ -567,8 -574,10 -568,8 -567,8 +575,10 @@@@@ __set_irq_handler(unsigned int irq, irq
    
        /* Uninstall? */
        if (handle == handle_bad_irq) {
- --            if (desc->chip != &no_irq_chip)
+ ++            if (desc->chip != &no_irq_chip) {
                        mask_ack_irq(desc, irq);
+ ++                    desc = irq_remap_to_desc(irq, desc);
+ ++            }
                desc->status |= IRQ_DISABLED;
                desc->depth = 1;
        }