diff options
author | Feng Tang <feng.tang@intel.com> | 2010-11-18 22:33:35 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2010-12-09 15:52:06 -0500 |
commit | 2d8009ba67f9503ceadf9d5a3b5637cee291ea8d (patch) | |
tree | ab3ca6aacc84b5fb0135909e788c5b65830cd75f /arch/x86/kernel | |
parent | 60d79fd99ff3b9c692b260a4d53a203f537c052a (diff) |
x86: Unify 3 similar ways of saving mp_irqs info
There are 3 places defining similar functions of saving IRQ vector
info into mp_irqs[] array: mmparse/acpi/mrst.
Replace the redundant code by a common function in io_apic.c as it's
only called when CONFIG_X86_IO_APIC=y
Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Len Brown <len.brown@intel.com>
Cc: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <20101207133204.4d913c5a@feng-i7>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 32 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 54 | ||||
-rw-r--r-- | arch/x86/kernel/mpparse.c | 56 |
3 files changed, 60 insertions, 82 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index b3cf01ab0630..1a5b9a8e6c4f 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -937,32 +937,6 @@ static int __init acpi_parse_madt_lapic_entries(void) | |||
937 | extern int es7000_plat; | 937 | extern int es7000_plat; |
938 | #endif | 938 | #endif |
939 | 939 | ||
940 | static void assign_to_mp_irq(struct mpc_intsrc *m, | ||
941 | struct mpc_intsrc *mp_irq) | ||
942 | { | ||
943 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
944 | } | ||
945 | |||
946 | static int mp_irq_cmp(struct mpc_intsrc *mp_irq, | ||
947 | struct mpc_intsrc *m) | ||
948 | { | ||
949 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
950 | } | ||
951 | |||
952 | static void save_mp_irq(struct mpc_intsrc *m) | ||
953 | { | ||
954 | int i; | ||
955 | |||
956 | for (i = 0; i < mp_irq_entries; i++) { | ||
957 | if (!mp_irq_cmp(&mp_irqs[i], m)) | ||
958 | return; | ||
959 | } | ||
960 | |||
961 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
962 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
963 | panic("Max # of irq sources exceeded!!\n"); | ||
964 | } | ||
965 | |||
966 | void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | 940 | void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) |
967 | { | 941 | { |
968 | int ioapic; | 942 | int ioapic; |
@@ -993,7 +967,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
993 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ | 967 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ |
994 | mp_irq.dstirq = pin; /* INTIN# */ | 968 | mp_irq.dstirq = pin; /* INTIN# */ |
995 | 969 | ||
996 | save_mp_irq(&mp_irq); | 970 | mp_save_irq(&mp_irq); |
997 | 971 | ||
998 | isa_irq_to_gsi[bus_irq] = gsi; | 972 | isa_irq_to_gsi[bus_irq] = gsi; |
999 | } | 973 | } |
@@ -1068,7 +1042,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1068 | mp_irq.srcbusirq = i; /* Identity mapped */ | 1042 | mp_irq.srcbusirq = i; /* Identity mapped */ |
1069 | mp_irq.dstirq = pin; | 1043 | mp_irq.dstirq = pin; |
1070 | 1044 | ||
1071 | save_mp_irq(&mp_irq); | 1045 | mp_save_irq(&mp_irq); |
1072 | } | 1046 | } |
1073 | } | 1047 | } |
1074 | 1048 | ||
@@ -1105,7 +1079,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger, | |||
1105 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; | 1079 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; |
1106 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); | 1080 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); |
1107 | 1081 | ||
1108 | save_mp_irq(&mp_irq); | 1082 | mp_save_irq(&mp_irq); |
1109 | #endif | 1083 | #endif |
1110 | return 0; | 1084 | return 0; |
1111 | } | 1085 | } |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 8a0215042a5f..c6b44f78ac14 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -126,6 +126,59 @@ static int __init parse_noapic(char *str) | |||
126 | } | 126 | } |
127 | early_param("noapic", parse_noapic); | 127 | early_param("noapic", parse_noapic); |
128 | 128 | ||
129 | static void assign_to_mp_irq(struct mpc_intsrc *m, | ||
130 | struct mpc_intsrc *mp_irq) | ||
131 | { | ||
132 | mp_irq->dstapic = m->dstapic; | ||
133 | mp_irq->type = m->type; | ||
134 | mp_irq->irqtype = m->irqtype; | ||
135 | mp_irq->irqflag = m->irqflag; | ||
136 | mp_irq->srcbus = m->srcbus; | ||
137 | mp_irq->srcbusirq = m->srcbusirq; | ||
138 | mp_irq->dstirq = m->dstirq; | ||
139 | } | ||
140 | |||
141 | static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, | ||
142 | struct mpc_intsrc *m) | ||
143 | { | ||
144 | if (mp_irq->dstapic != m->dstapic) | ||
145 | return 1; | ||
146 | if (mp_irq->type != m->type) | ||
147 | return 2; | ||
148 | if (mp_irq->irqtype != m->irqtype) | ||
149 | return 3; | ||
150 | if (mp_irq->irqflag != m->irqflag) | ||
151 | return 4; | ||
152 | if (mp_irq->srcbus != m->srcbus) | ||
153 | return 5; | ||
154 | if (mp_irq->srcbusirq != m->srcbusirq) | ||
155 | return 6; | ||
156 | if (mp_irq->dstirq != m->dstirq) | ||
157 | return 7; | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ | ||
163 | void mp_save_irq(struct mpc_intsrc *m) | ||
164 | { | ||
165 | int i; | ||
166 | |||
167 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | ||
168 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | ||
169 | m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus, | ||
170 | m->srcbusirq, m->dstapic, m->dstirq); | ||
171 | |||
172 | for (i = 0; i < mp_irq_entries; i++) { | ||
173 | if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) | ||
174 | return; | ||
175 | } | ||
176 | |||
177 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
178 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
179 | panic("Max # of irq sources exceeded!!\n"); | ||
180 | } | ||
181 | |||
129 | struct irq_pin_list { | 182 | struct irq_pin_list { |
130 | int apic, pin; | 183 | int apic, pin; |
131 | struct irq_pin_list *next; | 184 | struct irq_pin_list *next; |
@@ -136,6 +189,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node) | |||
136 | return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); | 189 | return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); |
137 | } | 190 | } |
138 | 191 | ||
192 | |||
139 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 193 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
140 | #ifdef CONFIG_SPARSE_IRQ | 194 | #ifdef CONFIG_SPARSE_IRQ |
141 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; | 195 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 27ccb7075342..4318687b1c35 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -144,18 +144,6 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) | |||
144 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); | 144 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); |
145 | } | 145 | } |
146 | 146 | ||
147 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, | ||
148 | struct mpc_intsrc *mp_irq) | ||
149 | { | ||
150 | mp_irq->dstapic = m->dstapic; | ||
151 | mp_irq->type = m->type; | ||
152 | mp_irq->irqtype = m->irqtype; | ||
153 | mp_irq->irqflag = m->irqflag; | ||
154 | mp_irq->srcbus = m->srcbus; | ||
155 | mp_irq->srcbusirq = m->srcbusirq; | ||
156 | mp_irq->dstirq = m->dstirq; | ||
157 | } | ||
158 | |||
159 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, | 147 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, |
160 | struct mpc_intsrc *m) | 148 | struct mpc_intsrc *m) |
161 | { | 149 | { |
@@ -167,47 +155,9 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, | |||
167 | m->srcbusirq = mp_irq->srcbusirq; | 155 | m->srcbusirq = mp_irq->srcbusirq; |
168 | m->dstirq = mp_irq->dstirq; | 156 | m->dstirq = mp_irq->dstirq; |
169 | } | 157 | } |
170 | |||
171 | static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, | ||
172 | struct mpc_intsrc *m) | ||
173 | { | ||
174 | if (mp_irq->dstapic != m->dstapic) | ||
175 | return 1; | ||
176 | if (mp_irq->type != m->type) | ||
177 | return 2; | ||
178 | if (mp_irq->irqtype != m->irqtype) | ||
179 | return 3; | ||
180 | if (mp_irq->irqflag != m->irqflag) | ||
181 | return 4; | ||
182 | if (mp_irq->srcbus != m->srcbus) | ||
183 | return 5; | ||
184 | if (mp_irq->srcbusirq != m->srcbusirq) | ||
185 | return 6; | ||
186 | if (mp_irq->dstirq != m->dstirq) | ||
187 | return 7; | ||
188 | |||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | static void __init MP_intsrc_info(struct mpc_intsrc *m) | ||
193 | { | ||
194 | int i; | ||
195 | |||
196 | print_MP_intsrc_info(m); | ||
197 | |||
198 | for (i = 0; i < mp_irq_entries; i++) { | ||
199 | if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) | ||
200 | return; | ||
201 | } | ||
202 | |||
203 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
204 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
205 | panic("Max # of irq sources exceeded!!\n"); | ||
206 | } | ||
207 | #else /* CONFIG_X86_IO_APIC */ | 158 | #else /* CONFIG_X86_IO_APIC */ |
208 | static inline void __init MP_bus_info(struct mpc_bus *m) {} | 159 | static inline void __init MP_bus_info(struct mpc_bus *m) {} |
209 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} | 160 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} |
210 | static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} | ||
211 | #endif /* CONFIG_X86_IO_APIC */ | 161 | #endif /* CONFIG_X86_IO_APIC */ |
212 | 162 | ||
213 | 163 | ||
@@ -321,7 +271,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
321 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); | 271 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
322 | break; | 272 | break; |
323 | case MP_INTSRC: | 273 | case MP_INTSRC: |
324 | MP_intsrc_info((struct mpc_intsrc *)mpt); | 274 | mp_save_irq((struct mpc_intsrc *)mpt); |
325 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); | 275 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
326 | break; | 276 | break; |
327 | case MP_LINTSRC: | 277 | case MP_LINTSRC: |
@@ -413,13 +363,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
413 | 363 | ||
414 | intsrc.srcbusirq = i; | 364 | intsrc.srcbusirq = i; |
415 | intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ | 365 | intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ |
416 | MP_intsrc_info(&intsrc); | 366 | mp_save_irq(&intsrc); |
417 | } | 367 | } |
418 | 368 | ||
419 | intsrc.irqtype = mp_ExtINT; | 369 | intsrc.irqtype = mp_ExtINT; |
420 | intsrc.srcbusirq = 0; | 370 | intsrc.srcbusirq = 0; |
421 | intsrc.dstirq = 0; /* 8259A to INTIN0 */ | 371 | intsrc.dstirq = 0; /* 8259A to INTIN0 */ |
422 | MP_intsrc_info(&intsrc); | 372 | mp_save_irq(&intsrc); |
423 | } | 373 | } |
424 | 374 | ||
425 | 375 | ||