diff options
author | Tony Luck <tony.luck@intel.com> | 2010-10-05 18:41:25 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2010-10-05 18:41:25 -0400 |
commit | 4de0a7594823d04361281e34e59f2c1108899f3e (patch) | |
tree | 5760d5a73761afaed76ce7169167a759b1e53562 /arch/ia64 | |
parent | 899611ee7d373e5eeda08e9a8632684e1ebbbf00 (diff) |
[IA64] Initialize interrupts later (from init_IRQ())
Thomas Gleixner is cleaning up the generic irq code, and ia64 ran
into problems because it calls register_intr() before early_irq_init()
is called. Move the call to acpi_boot_init() from setup_arch() to
init_IRQ().
As a bonus - moving the call later means we no longer need the
hacks in iosapic.c to switch between the bootmem and regular
allocator - we can just used kzalloc() for allocation.
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/kernel/iosapic.c | 48 | ||||
-rw-r--r-- | arch/ia64/kernel/irq_ia64.c | 4 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 4 |
3 files changed, 5 insertions, 51 deletions
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 7ded76658d2d..66ec07806ad9 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -108,10 +108,6 @@ | |||
108 | #define DBG(fmt...) | 108 | #define DBG(fmt...) |
109 | #endif | 109 | #endif |
110 | 110 | ||
111 | #define NR_PREALLOCATE_RTE_ENTRIES \ | ||
112 | (PAGE_SIZE / sizeof(struct iosapic_rte_info)) | ||
113 | #define RTE_PREALLOCATED (1) | ||
114 | |||
115 | static DEFINE_SPINLOCK(iosapic_lock); | 111 | static DEFINE_SPINLOCK(iosapic_lock); |
116 | 112 | ||
117 | /* | 113 | /* |
@@ -136,7 +132,6 @@ struct iosapic_rte_info { | |||
136 | struct list_head rte_list; /* RTEs sharing the same vector */ | 132 | struct list_head rte_list; /* RTEs sharing the same vector */ |
137 | char rte_index; /* IOSAPIC RTE index */ | 133 | char rte_index; /* IOSAPIC RTE index */ |
138 | int refcnt; /* reference counter */ | 134 | int refcnt; /* reference counter */ |
139 | unsigned int flags; /* flags */ | ||
140 | struct iosapic *iosapic; | 135 | struct iosapic *iosapic; |
141 | } ____cacheline_aligned; | 136 | } ____cacheline_aligned; |
142 | 137 | ||
@@ -155,9 +150,6 @@ static struct iosapic_intr_info { | |||
155 | 150 | ||
156 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ | 151 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ |
157 | 152 | ||
158 | static int iosapic_kmalloc_ok; | ||
159 | static LIST_HEAD(free_rte_list); | ||
160 | |||
161 | static inline void | 153 | static inline void |
162 | iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) | 154 | iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) |
163 | { | 155 | { |
@@ -552,37 +544,6 @@ iosapic_reassign_vector (int irq) | |||
552 | } | 544 | } |
553 | } | 545 | } |
554 | 546 | ||
555 | static struct iosapic_rte_info * __init_refok iosapic_alloc_rte (void) | ||
556 | { | ||
557 | int i; | ||
558 | struct iosapic_rte_info *rte; | ||
559 | int preallocated = 0; | ||
560 | |||
561 | if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) { | ||
562 | rte = alloc_bootmem(sizeof(struct iosapic_rte_info) * | ||
563 | NR_PREALLOCATE_RTE_ENTRIES); | ||
564 | for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++) | ||
565 | list_add(&rte->rte_list, &free_rte_list); | ||
566 | } | ||
567 | |||
568 | if (!list_empty(&free_rte_list)) { | ||
569 | rte = list_entry(free_rte_list.next, struct iosapic_rte_info, | ||
570 | rte_list); | ||
571 | list_del(&rte->rte_list); | ||
572 | preallocated++; | ||
573 | } else { | ||
574 | rte = kmalloc(sizeof(struct iosapic_rte_info), GFP_ATOMIC); | ||
575 | if (!rte) | ||
576 | return NULL; | ||
577 | } | ||
578 | |||
579 | memset(rte, 0, sizeof(struct iosapic_rte_info)); | ||
580 | if (preallocated) | ||
581 | rte->flags |= RTE_PREALLOCATED; | ||
582 | |||
583 | return rte; | ||
584 | } | ||
585 | |||
586 | static inline int irq_is_shared (int irq) | 547 | static inline int irq_is_shared (int irq) |
587 | { | 548 | { |
588 | return (iosapic_intr_info[irq].count > 1); | 549 | return (iosapic_intr_info[irq].count > 1); |
@@ -615,7 +576,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
615 | 576 | ||
616 | rte = find_rte(irq, gsi); | 577 | rte = find_rte(irq, gsi); |
617 | if (!rte) { | 578 | if (!rte) { |
618 | rte = iosapic_alloc_rte(); | 579 | rte = kzalloc(sizeof (*rte), GFP_ATOMIC); |
619 | if (!rte) { | 580 | if (!rte) { |
620 | printk(KERN_WARNING "%s: cannot allocate memory\n", | 581 | printk(KERN_WARNING "%s: cannot allocate memory\n", |
621 | __func__); | 582 | __func__); |
@@ -1161,10 +1122,3 @@ map_iosapic_to_node(unsigned int gsi_base, int node) | |||
1161 | return; | 1122 | return; |
1162 | } | 1123 | } |
1163 | #endif | 1124 | #endif |
1164 | |||
1165 | static int __init iosapic_enable_kmalloc (void) | ||
1166 | { | ||
1167 | iosapic_kmalloc_ok = 1; | ||
1168 | return 0; | ||
1169 | } | ||
1170 | core_initcall (iosapic_enable_kmalloc); | ||
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index f14c35f9b03a..07d4f94e40ba 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <linux/ratelimit.h> | 32 | #include <linux/ratelimit.h> |
33 | #include <linux/acpi.h> | ||
33 | 34 | ||
34 | #include <asm/delay.h> | 35 | #include <asm/delay.h> |
35 | #include <asm/intrinsics.h> | 36 | #include <asm/intrinsics.h> |
@@ -650,6 +651,9 @@ ia64_native_register_ipi(void) | |||
650 | void __init | 651 | void __init |
651 | init_IRQ (void) | 652 | init_IRQ (void) |
652 | { | 653 | { |
654 | #ifdef CONFIG_ACPI | ||
655 | acpi_boot_init(); | ||
656 | #endif | ||
653 | ia64_register_ipi(); | 657 | ia64_register_ipi(); |
654 | register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL); | 658 | register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL); |
655 | #ifdef CONFIG_SMP | 659 | #ifdef CONFIG_SMP |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 8fb958abf8d0..911cf9749700 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -594,10 +594,6 @@ setup_arch (char **cmdline_p) | |||
594 | cpu_init(); /* initialize the bootstrap CPU */ | 594 | cpu_init(); /* initialize the bootstrap CPU */ |
595 | mmu_context_init(); /* initialize context_id bitmap */ | 595 | mmu_context_init(); /* initialize context_id bitmap */ |
596 | 596 | ||
597 | #ifdef CONFIG_ACPI | ||
598 | acpi_boot_init(); | ||
599 | #endif | ||
600 | |||
601 | paravirt_banner(); | 597 | paravirt_banner(); |
602 | paravirt_arch_setup_console(cmdline_p); | 598 | paravirt_arch_setup_console(cmdline_p); |
603 | 599 | ||