diff options
| -rw-r--r-- | arch/x86/include/asm/irq.h | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 33 | ||||
| -rw-r--r-- | arch/x86/kernel/irqinit.c | 35 | ||||
| -rw-r--r-- | arch/x86/kernel/vmiclock_32.c | 2 |
4 files changed, 30 insertions, 41 deletions
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 5458380b6ef8..262292729fc4 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
| @@ -48,5 +48,6 @@ extern DECLARE_BITMAP(used_vectors, NR_VECTORS); | |||
| 48 | extern int vector_used_by_percpu_irq(unsigned int vector); | 48 | extern int vector_used_by_percpu_irq(unsigned int vector); |
| 49 | 49 | ||
| 50 | extern void init_ISA_irqs(void); | 50 | extern void init_ISA_irqs(void); |
| 51 | extern int nr_legacy_irqs; | ||
| 51 | 52 | ||
| 52 | #endif /* _ASM_X86_IRQ_H */ | 53 | #endif /* _ASM_X86_IRQ_H */ |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 409f4943dc1a..1a30587a6bc2 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -94,8 +94,6 @@ struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; | |||
| 94 | /* # of MP IRQ source entries */ | 94 | /* # of MP IRQ source entries */ |
| 95 | int mp_irq_entries; | 95 | int mp_irq_entries; |
| 96 | 96 | ||
| 97 | /* Number of legacy interrupts */ | ||
| 98 | static int nr_legacy_irqs __read_mostly = NR_IRQS_LEGACY; | ||
| 99 | /* GSI interrupts */ | 97 | /* GSI interrupts */ |
| 100 | static int nr_irqs_gsi = NR_IRQS_LEGACY; | 98 | static int nr_irqs_gsi = NR_IRQS_LEGACY; |
| 101 | 99 | ||
| @@ -140,27 +138,10 @@ static struct irq_pin_list *get_one_free_irq_2_pin(int node) | |||
| 140 | 138 | ||
| 141 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 139 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
| 142 | #ifdef CONFIG_SPARSE_IRQ | 140 | #ifdef CONFIG_SPARSE_IRQ |
| 143 | static struct irq_cfg irq_cfgx[] = { | 141 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; |
| 144 | #else | 142 | #else |
| 145 | static struct irq_cfg irq_cfgx[NR_IRQS] = { | 143 | static struct irq_cfg irq_cfgx[NR_IRQS]; |
| 146 | #endif | 144 | #endif |
| 147 | [0] = { .vector = IRQ0_VECTOR, }, | ||
| 148 | [1] = { .vector = IRQ1_VECTOR, }, | ||
| 149 | [2] = { .vector = IRQ2_VECTOR, }, | ||
| 150 | [3] = { .vector = IRQ3_VECTOR, }, | ||
| 151 | [4] = { .vector = IRQ4_VECTOR, }, | ||
| 152 | [5] = { .vector = IRQ5_VECTOR, }, | ||
| 153 | [6] = { .vector = IRQ6_VECTOR, }, | ||
| 154 | [7] = { .vector = IRQ7_VECTOR, }, | ||
| 155 | [8] = { .vector = IRQ8_VECTOR, }, | ||
| 156 | [9] = { .vector = IRQ9_VECTOR, }, | ||
| 157 | [10] = { .vector = IRQ10_VECTOR, }, | ||
| 158 | [11] = { .vector = IRQ11_VECTOR, }, | ||
| 159 | [12] = { .vector = IRQ12_VECTOR, }, | ||
| 160 | [13] = { .vector = IRQ13_VECTOR, }, | ||
| 161 | [14] = { .vector = IRQ14_VECTOR, }, | ||
| 162 | [15] = { .vector = IRQ15_VECTOR, }, | ||
| 163 | }; | ||
| 164 | 145 | ||
| 165 | void __init io_apic_disable_legacy(void) | 146 | void __init io_apic_disable_legacy(void) |
| 166 | { | 147 | { |
| @@ -185,8 +166,14 @@ int __init arch_early_irq_init(void) | |||
| 185 | desc->chip_data = &cfg[i]; | 166 | desc->chip_data = &cfg[i]; |
| 186 | zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node); | 167 | zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node); |
| 187 | zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node); | 168 | zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node); |
| 188 | if (i < nr_legacy_irqs) | 169 | /* |
| 189 | cpumask_setall(cfg[i].domain); | 170 | * For legacy IRQ's, start with assigning irq0 to irq15 to |
| 171 | * IRQ0_VECTOR to IRQ15_VECTOR on cpu 0. | ||
| 172 | */ | ||
| 173 | if (i < nr_legacy_irqs) { | ||
| 174 | cfg[i].vector = IRQ0_VECTOR + i; | ||
| 175 | cpumask_set_cpu(0, cfg[i].domain); | ||
| 176 | } | ||
| 190 | } | 177 | } |
| 191 | 178 | ||
| 192 | return 0; | 179 | return 0; |
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index d5932226614f..fce55d532631 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
| @@ -84,24 +84,7 @@ static struct irqaction irq2 = { | |||
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | 86 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { |
| 87 | [0 ... IRQ0_VECTOR - 1] = -1, | 87 | [0 ... NR_VECTORS - 1] = -1, |
| 88 | [IRQ0_VECTOR] = 0, | ||
| 89 | [IRQ1_VECTOR] = 1, | ||
| 90 | [IRQ2_VECTOR] = 2, | ||
| 91 | [IRQ3_VECTOR] = 3, | ||
| 92 | [IRQ4_VECTOR] = 4, | ||
| 93 | [IRQ5_VECTOR] = 5, | ||
| 94 | [IRQ6_VECTOR] = 6, | ||
| 95 | [IRQ7_VECTOR] = 7, | ||
| 96 | [IRQ8_VECTOR] = 8, | ||
| 97 | [IRQ9_VECTOR] = 9, | ||
| 98 | [IRQ10_VECTOR] = 10, | ||
| 99 | [IRQ11_VECTOR] = 11, | ||
| 100 | [IRQ12_VECTOR] = 12, | ||
| 101 | [IRQ13_VECTOR] = 13, | ||
| 102 | [IRQ14_VECTOR] = 14, | ||
| 103 | [IRQ15_VECTOR] = 15, | ||
| 104 | [IRQ15_VECTOR + 1 ... NR_VECTORS - 1] = -1 | ||
| 105 | }; | 88 | }; |
| 106 | 89 | ||
| 107 | int vector_used_by_percpu_irq(unsigned int vector) | 90 | int vector_used_by_percpu_irq(unsigned int vector) |
| @@ -116,6 +99,9 @@ int vector_used_by_percpu_irq(unsigned int vector) | |||
| 116 | return 0; | 99 | return 0; |
| 117 | } | 100 | } |
| 118 | 101 | ||
| 102 | /* Number of legacy interrupts */ | ||
| 103 | int nr_legacy_irqs __read_mostly = NR_IRQS_LEGACY; | ||
| 104 | |||
| 119 | void __init init_ISA_irqs(void) | 105 | void __init init_ISA_irqs(void) |
| 120 | { | 106 | { |
| 121 | int i; | 107 | int i; |
| @@ -142,6 +128,19 @@ void __init init_ISA_irqs(void) | |||
| 142 | 128 | ||
| 143 | void __init init_IRQ(void) | 129 | void __init init_IRQ(void) |
| 144 | { | 130 | { |
| 131 | int i; | ||
| 132 | |||
| 133 | /* | ||
| 134 | * On cpu 0, Assign IRQ0_VECTOR..IRQ15_VECTOR's to IRQ 0..15. | ||
| 135 | * If these IRQ's are handled by legacy interrupt-controllers like PIC, | ||
| 136 | * then this configuration will likely be static after the boot. If | ||
| 137 | * these IRQ's are handled by more mordern controllers like IO-APIC, | ||
| 138 | * then this vector space can be freed and re-used dynamically as the | ||
| 139 | * irq's migrate etc. | ||
| 140 | */ | ||
| 141 | for (i = 0; i < nr_legacy_irqs; i++) | ||
| 142 | per_cpu(vector_irq, 0)[IRQ0_VECTOR + i] = i; | ||
| 143 | |||
| 145 | x86_init.irqs.intr_init(); | 144 | x86_init.irqs.intr_init(); |
| 146 | } | 145 | } |
| 147 | 146 | ||
diff --git a/arch/x86/kernel/vmiclock_32.c b/arch/x86/kernel/vmiclock_32.c index 1268d993e9ca..2f1ca5614292 100644 --- a/arch/x86/kernel/vmiclock_32.c +++ b/arch/x86/kernel/vmiclock_32.c | |||
| @@ -235,6 +235,8 @@ void __init vmi_time_init(void) | |||
| 235 | 235 | ||
| 236 | vmi_time_init_clockevent(); | 236 | vmi_time_init_clockevent(); |
| 237 | setup_irq(0, &vmi_clock_action); | 237 | setup_irq(0, &vmi_clock_action); |
| 238 | for_each_possible_cpu(cpu) | ||
| 239 | per_cpu(vector_irq, cpu)[vmi_get_timer_vector()] = 0; | ||
| 238 | } | 240 | } |
| 239 | 241 | ||
| 240 | #ifdef CONFIG_X86_LOCAL_APIC | 242 | #ifdef CONFIG_X86_LOCAL_APIC |
