powerpc: make irq_choose_cpu() available to all PIC drivers
Move irq_choose_cpu() into arch/powerpc/kernel/irq.c so that it can be used by other PIC drivers. The function is not MPIC-specific. Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com> Signed-off-by: Timur Tabi <timur@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
parent
47fe819e75
commit
6ec36b5848
|
@ -330,5 +330,7 @@ extern int call_handle_irq(int irq, void *p1,
|
||||||
struct thread_info *tp, void *func);
|
struct thread_info *tp, void *func);
|
||||||
extern void do_IRQ(struct pt_regs *regs);
|
extern void do_IRQ(struct pt_regs *regs);
|
||||||
|
|
||||||
|
int irq_choose_cpu(const struct cpumask *mask);
|
||||||
|
|
||||||
#endif /* _ASM_IRQ_H */
|
#endif /* _ASM_IRQ_H */
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -882,6 +882,41 @@ unsigned int irq_find_mapping(struct irq_host *host,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
int irq_choose_cpu(const struct cpumask *mask)
|
||||||
|
{
|
||||||
|
int cpuid;
|
||||||
|
|
||||||
|
if (cpumask_equal(mask, cpu_all_mask)) {
|
||||||
|
static int irq_rover;
|
||||||
|
static DEFINE_RAW_SPINLOCK(irq_rover_lock);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
/* Round-robin distribution... */
|
||||||
|
do_round_robin:
|
||||||
|
raw_spin_lock_irqsave(&irq_rover_lock, flags);
|
||||||
|
|
||||||
|
irq_rover = cpumask_next(irq_rover, cpu_online_mask);
|
||||||
|
if (irq_rover >= nr_cpu_ids)
|
||||||
|
irq_rover = cpumask_first(cpu_online_mask);
|
||||||
|
|
||||||
|
cpuid = irq_rover;
|
||||||
|
|
||||||
|
raw_spin_unlock_irqrestore(&irq_rover_lock, flags);
|
||||||
|
} else {
|
||||||
|
cpuid = cpumask_first_and(mask, cpu_online_mask);
|
||||||
|
if (cpuid >= nr_cpu_ids)
|
||||||
|
goto do_round_robin;
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_hard_smp_processor_id(cpuid);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int irq_choose_cpu(const struct cpumask *mask)
|
||||||
|
{
|
||||||
|
return hard_smp_processor_id();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned int irq_radix_revmap_lookup(struct irq_host *host,
|
unsigned int irq_radix_revmap_lookup(struct irq_host *host,
|
||||||
irq_hw_number_t hwirq)
|
irq_hw_number_t hwirq)
|
||||||
|
|
|
@ -597,42 +597,6 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic)
|
||||||
|
|
||||||
#endif /* CONFIG_MPIC_U3_HT_IRQS */
|
#endif /* CONFIG_MPIC_U3_HT_IRQS */
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
static int irq_choose_cpu(const struct cpumask *mask)
|
|
||||||
{
|
|
||||||
int cpuid;
|
|
||||||
|
|
||||||
if (cpumask_equal(mask, cpu_all_mask)) {
|
|
||||||
static int irq_rover = 0;
|
|
||||||
static DEFINE_RAW_SPINLOCK(irq_rover_lock);
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* Round-robin distribution... */
|
|
||||||
do_round_robin:
|
|
||||||
raw_spin_lock_irqsave(&irq_rover_lock, flags);
|
|
||||||
|
|
||||||
irq_rover = cpumask_next(irq_rover, cpu_online_mask);
|
|
||||||
if (irq_rover >= nr_cpu_ids)
|
|
||||||
irq_rover = cpumask_first(cpu_online_mask);
|
|
||||||
|
|
||||||
cpuid = irq_rover;
|
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&irq_rover_lock, flags);
|
|
||||||
} else {
|
|
||||||
cpuid = cpumask_first_and(mask, cpu_online_mask);
|
|
||||||
if (cpuid >= nr_cpu_ids)
|
|
||||||
goto do_round_robin;
|
|
||||||
}
|
|
||||||
|
|
||||||
return get_hard_smp_processor_id(cpuid);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static int irq_choose_cpu(const struct cpumask *mask)
|
|
||||||
{
|
|
||||||
return hard_smp_processor_id();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Find an mpic associated with a given linux interrupt */
|
/* Find an mpic associated with a given linux interrupt */
|
||||||
static struct mpic *mpic_find(unsigned int irq)
|
static struct mpic *mpic_find(unsigned int irq)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue