浏览代码

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>
Paul Mundt 16 年之前
父节点
当前提交
54ff328b46
共有 3 个文件被更改,包括 18 次插入11 次删除
  1. 12 0
      arch/sh/Kconfig
  2. 2 5
      arch/sh/kernel/cpu/irq/ipr.c
  3. 4 6
      drivers/sh/intc.c

+ 12 - 0
arch/sh/Kconfig

@@ -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"

+ 2 - 5
arch/sh/kernel/cpu/irq/ipr.c

@@ -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_cpu(p->irq, smp_processor_id());
+		irq_desc = irq_to_desc_alloc_node(p->irq, numa_node_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,

+ 4 - 6
drivers/sh/intc.c

@@ -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_cpu(irq, cpu);
+		irq_desc = irq_to_desc_alloc_node(irq, numa_node_id());
 		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);
 	}
 	}