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>

authored by Feng Tang and committed by Thomas Gleixner 2d8009ba 60d79fd9

+64 -110
+2
arch/x86/include/asm/io_apic.h
··· 184 184 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); 185 185 extern void __init pre_init_apic_IRQ0(void); 186 186 187 + extern void mp_save_irq(struct mpc_intsrc *m); 188 + 187 189 #else /* !CONFIG_X86_IO_APIC */ 188 190 189 191 #define io_apic_assign_pci_irqs 0
+3 -29
arch/x86/kernel/acpi/boot.c
··· 937 937 extern int es7000_plat; 938 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 940 void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) 967 941 { 968 942 int ioapic; ··· 967 993 mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ 968 994 mp_irq.dstirq = pin; /* INTIN# */ 969 995 970 - save_mp_irq(&mp_irq); 996 + mp_save_irq(&mp_irq); 971 997 972 998 isa_irq_to_gsi[bus_irq] = gsi; 973 999 } ··· 1042 1068 mp_irq.srcbusirq = i; /* Identity mapped */ 1043 1069 mp_irq.dstirq = pin; 1044 1070 1045 - save_mp_irq(&mp_irq); 1071 + mp_save_irq(&mp_irq); 1046 1072 } 1047 1073 } 1048 1074 ··· 1079 1105 mp_irq.dstapic = mp_ioapics[ioapic].apicid; 1080 1106 mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); 1081 1107 1082 - save_mp_irq(&mp_irq); 1108 + mp_save_irq(&mp_irq); 1083 1109 #endif 1084 1110 return 0; 1085 1111 }
+54
arch/x86/kernel/apic/io_apic.c
··· 126 126 } 127 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 182 struct irq_pin_list { 130 183 int apic, pin; 131 184 struct irq_pin_list *next; ··· 188 135 { 189 136 return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); 190 137 } 138 + 191 139 192 140 /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ 193 141 #ifdef CONFIG_SPARSE_IRQ
+3 -53
arch/x86/kernel/mpparse.c
··· 144 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 147 static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, 160 148 struct mpc_intsrc *m) 161 149 { ··· 155 167 m->srcbusirq = mp_irq->srcbusirq; 156 168 m->dstirq = mp_irq->dstirq; 157 169 } 158 - 159 - static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, 160 - struct mpc_intsrc *m) 161 - { 162 - if (mp_irq->dstapic != m->dstapic) 163 - return 1; 164 - if (mp_irq->type != m->type) 165 - return 2; 166 - if (mp_irq->irqtype != m->irqtype) 167 - return 3; 168 - if (mp_irq->irqflag != m->irqflag) 169 - return 4; 170 - if (mp_irq->srcbus != m->srcbus) 171 - return 5; 172 - if (mp_irq->srcbusirq != m->srcbusirq) 173 - return 6; 174 - if (mp_irq->dstirq != m->dstirq) 175 - return 7; 176 - 177 - return 0; 178 - } 179 - 180 - static void __init MP_intsrc_info(struct mpc_intsrc *m) 181 - { 182 - int i; 183 - 184 - print_MP_intsrc_info(m); 185 - 186 - for (i = 0; i < mp_irq_entries; i++) { 187 - if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) 188 - return; 189 - } 190 - 191 - assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); 192 - if (++mp_irq_entries == MAX_IRQ_SOURCES) 193 - panic("Max # of irq sources exceeded!!\n"); 194 - } 195 170 #else /* CONFIG_X86_IO_APIC */ 196 171 static inline void __init MP_bus_info(struct mpc_bus *m) {} 197 172 static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} 198 - static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} 199 173 #endif /* CONFIG_X86_IO_APIC */ 200 174 201 175 ··· 271 321 skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); 272 322 break; 273 323 case MP_INTSRC: 274 - MP_intsrc_info((struct mpc_intsrc *)mpt); 324 + mp_save_irq((struct mpc_intsrc *)mpt); 275 325 skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); 276 326 break; 277 327 case MP_LINTSRC: ··· 363 413 364 414 intsrc.srcbusirq = i; 365 415 intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ 366 - MP_intsrc_info(&intsrc); 416 + mp_save_irq(&intsrc); 367 417 } 368 418 369 419 intsrc.irqtype = mp_ExtINT; 370 420 intsrc.srcbusirq = 0; 371 421 intsrc.dstirq = 0; /* 8259A to INTIN0 */ 372 - MP_intsrc_info(&intsrc); 422 + mp_save_irq(&intsrc); 373 423 } 374 424 375 425
+2 -28
arch/x86/platform/mrst/mrst.c
··· 71 71 EXPORT_SYMBOL_GPL(sfi_mrtc_array); 72 72 int sfi_mrtc_num; 73 73 74 - static inline void assign_to_mp_irq(struct mpc_intsrc *m, 75 - struct mpc_intsrc *mp_irq) 76 - { 77 - memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); 78 - } 79 - 80 - static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq, 81 - struct mpc_intsrc *m) 82 - { 83 - return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); 84 - } 85 - 86 - static void save_mp_irq(struct mpc_intsrc *m) 87 - { 88 - int i; 89 - 90 - for (i = 0; i < mp_irq_entries; i++) { 91 - if (!mp_irq_cmp(&mp_irqs[i], m)) 92 - return; 93 - } 94 - 95 - assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); 96 - if (++mp_irq_entries == MAX_IRQ_SOURCES) 97 - panic("Max # of irq sources exceeded!!\n"); 98 - } 99 - 100 74 /* parse all the mtimer info to a static mtimer array */ 101 75 static int __init sfi_parse_mtmr(struct sfi_table_header *table) 102 76 { ··· 104 130 mp_irq.srcbusirq = pentry->irq; /* IRQ */ 105 131 mp_irq.dstapic = MP_APIC_ALL; 106 132 mp_irq.dstirq = pentry->irq; 107 - save_mp_irq(&mp_irq); 133 + mp_save_irq(&mp_irq); 108 134 } 109 135 110 136 return 0; ··· 174 200 mp_irq.srcbusirq = pentry->irq; /* IRQ */ 175 201 mp_irq.dstapic = MP_APIC_ALL; 176 202 mp_irq.dstirq = pentry->irq; 177 - save_mp_irq(&mp_irq); 203 + mp_save_irq(&mp_irq); 178 204 } 179 205 return 0; 180 206 }