|
@@ -48,6 +48,36 @@ handle_bad_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
* Controller mappings for all interrupt sources:
|
|
|
*/
|
|
|
int nr_irqs = NR_IRQS;
|
|
|
+
|
|
|
+#ifdef CONFIG_HAVE_DYN_ARRAY
|
|
|
+static struct irq_desc irq_desc_init __initdata = {
|
|
|
+ .status = IRQ_DISABLED,
|
|
|
+ .chip = &no_irq_chip,
|
|
|
+ .handle_irq = handle_bad_irq,
|
|
|
+ .depth = 1,
|
|
|
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ .affinity = CPU_MASK_ALL
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+static void __init init_work(void *data)
|
|
|
+{
|
|
|
+ struct dyn_array *da = data;
|
|
|
+ int i;
|
|
|
+ struct irq_desc *desc;
|
|
|
+
|
|
|
+ desc = *da->name;
|
|
|
+
|
|
|
+ for (i = 0; i < *da->nr; i++)
|
|
|
+ memcpy(&desc[i], &irq_desc_init, sizeof(struct irq_desc));
|
|
|
+}
|
|
|
+
|
|
|
+struct irq_desc *irq_desc;
|
|
|
+DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irqs, PAGE_SIZE, init_work);
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
|
|
|
[0 ... NR_IRQS-1] = {
|
|
|
.status = IRQ_DISABLED,
|
|
@@ -60,6 +90,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
|
|
|
#endif
|
|
|
}
|
|
|
};
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
|
* What should we do if we get a hw irq event on an illegal vector?
|