sh: Tie sparseirq in to Kconfig.

Now that the dependent patches are merged, we are ready to enable
sparseirq support. This simply adds the Kconfig option, and then converts
from the _cpu to the _node allocation routines to follow the upstream
sparseirq API changes.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Paul Mundt 2009-06-11 10:33:09 +03:00
parent 6a1555fdde
commit 54ff328b46
3 changed files with 18 additions and 11 deletions

View File

@ -678,6 +678,18 @@ config GUSA_RB
LLSC, this should be more efficient than the other alternative of LLSC, this should be more efficient than the other alternative of
disabling interrupts around the atomic sequence. disabling interrupts around the atomic sequence.
config SPARSE_IRQ
bool "Support sparse irq numbering"
depends on EXPERIMENTAL
help
This enables support for sparse irqs. This is useful in general
as most CPUs have a fairly sparse array of IRQ vectors, which
the irq_desc then maps directly on to. Systems with a high
number of off-chip IRQs will want to treat this as
experimental until they have been independently verified.
If you don't know what to do here, say N.
endmenu endmenu
menu "Boot options" menu "Boot options"

View File

@ -21,6 +21,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/topology.h>
static inline struct ipr_desc *get_ipr_desc(unsigned int irq) static inline struct ipr_desc *get_ipr_desc(unsigned int irq)
{ {
@ -59,21 +60,17 @@ void register_ipr_controller(struct ipr_desc *desc)
for (i = 0; i < desc->nr_irqs; i++) { for (i = 0; i < desc->nr_irqs; i++) {
struct ipr_data *p = desc->ipr_data + i; struct ipr_data *p = desc->ipr_data + i;
#ifdef CONFIG_SPARSE_IRQ
struct irq_desc *irq_desc; struct irq_desc *irq_desc;
#endif
BUG_ON(p->ipr_idx >= desc->nr_offsets); BUG_ON(p->ipr_idx >= desc->nr_offsets);
BUG_ON(!desc->ipr_offsets[p->ipr_idx]); BUG_ON(!desc->ipr_offsets[p->ipr_idx]);
#ifdef CONFIG_SPARSE_IRQ irq_desc = irq_to_desc_alloc_node(p->irq, numa_node_id());
irq_desc = irq_to_desc_alloc_cpu(p->irq, smp_processor_id());
if (unlikely(!irq_desc)) { if (unlikely(!irq_desc)) {
printk(KERN_INFO "can not get irq_desc for %d\n", printk(KERN_INFO "can not get irq_desc for %d\n",
p->irq); p->irq);
continue; continue;
} }
#endif
disable_irq_nosync(p->irq); disable_irq_nosync(p->irq);
set_irq_chip_and_handler_name(p->irq, &desc->chip, set_irq_chip_and_handler_name(p->irq, &desc->chip,

View File

@ -24,6 +24,7 @@
#include <linux/sh_intc.h> #include <linux/sh_intc.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/topology.h>
#define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \ #define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \
((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \ ((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \
@ -671,7 +672,7 @@ unsigned int intc_evt2irq(unsigned int vector)
void __init register_intc_controller(struct intc_desc *desc) void __init register_intc_controller(struct intc_desc *desc)
{ {
unsigned int i, k, smp, cpu = smp_processor_id(); unsigned int i, k, smp;
struct intc_desc_int *d; struct intc_desc_int *d;
d = alloc_bootmem(sizeof(*d)); d = alloc_bootmem(sizeof(*d));
@ -771,19 +772,16 @@ void __init register_intc_controller(struct intc_desc *desc)
for (i = 0; i < desc->nr_vectors; i++) { for (i = 0; i < desc->nr_vectors; i++) {
struct intc_vect *vect = desc->vectors + i; struct intc_vect *vect = desc->vectors + i;
unsigned int irq = evt2irq(vect->vect); unsigned int irq = evt2irq(vect->vect);
#ifdef CONFIG_SPARSE_IRQ
struct irq_desc *irq_desc; struct irq_desc *irq_desc;
#endif
if (!vect->enum_id) if (!vect->enum_id)
continue; continue;
#ifdef CONFIG_SPARSE_IRQ irq_desc = irq_to_desc_alloc_node(irq, numa_node_id());
irq_desc = irq_to_desc_alloc_cpu(irq, cpu);
if (unlikely(!irq_desc)) { if (unlikely(!irq_desc)) {
printk(KERN_INFO "can not get irq_desc for %d\n", irq); printk(KERN_INFO "can not get irq_desc for %d\n", irq);
continue; continue;
} }
#endif
intc_register_irq(desc, d, vect->enum_id, irq); intc_register_irq(desc, d, vect->enum_id, irq);
} }