aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-01-07 17:55:31 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-07 17:55:31 -0500
commitd004e4d3322340b6433caaef4a47ab8c933afb70 (patch)
treef9ba6e6cb960fddb09da7c322d4b1dcb3f4b0e6f /arch
parent128283a47e7cc6754db3d2704004c1ed728d26db (diff)
parent1c2a48cf65580a276552151eb8f78d78c55b828e (diff)
Merge branch 'x86-apic-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-apic-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: apic: Cleanup and simplify setup_local_APIC() x86: Further simplify mp_irq info handling x86: Unify 3 similar ways of saving mp_irqs info x86, ioapic: Avoid writing io_apic id if already correct x86, x2apic: Don't map lapic addr for preenabled x2apic systems x86, sfi: Use register_lapic_address() x86, apic: Use register_lapic_address() in init_apic_mapping() x86, apic: Remove early_init_lapic_mapping() x86, apic: Unify identical register_lapic_address() functions
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/apic.h2
-rw-r--r--arch/x86/include/asm/io_apic.h3
-rw-r--r--arch/x86/kernel/acpi/boot.c48
-rw-r--r--arch/x86/kernel/apic/apic.c64
-rw-r--r--arch/x86/kernel/apic/io_apic.c28
-rw-r--r--arch/x86/kernel/mpparse.c114
-rw-r--r--arch/x86/mm/amdtopology_64.c1
-rw-r--r--arch/x86/platform/mrst/mrst.c30
-rw-r--r--arch/x86/platform/sfi/sfi.c13
9 files changed, 75 insertions, 228 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index cf12007796db..5e3969c36d7f 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -234,6 +234,7 @@ extern void init_bsp_APIC(void);
234extern void setup_local_APIC(void); 234extern void setup_local_APIC(void);
235extern void end_local_APIC_setup(void); 235extern void end_local_APIC_setup(void);
236extern void init_apic_mappings(void); 236extern void init_apic_mappings(void);
237void register_lapic_address(unsigned long address);
237extern void setup_boot_APIC_clock(void); 238extern void setup_boot_APIC_clock(void);
238extern void setup_secondary_APIC_clock(void); 239extern void setup_secondary_APIC_clock(void);
239extern int APIC_init_uniprocessor(void); 240extern int APIC_init_uniprocessor(void);
@@ -244,7 +245,6 @@ extern int apic_force_enable(void);
244 * On 32bit this is mach-xxx local 245 * On 32bit this is mach-xxx local
245 */ 246 */
246#ifdef CONFIG_X86_64 247#ifdef CONFIG_X86_64
247extern void early_init_lapic_mapping(void);
248extern int apic_is_clustered_box(void); 248extern int apic_is_clustered_box(void);
249#else 249#else
250static inline int apic_is_clustered_box(void) 250static inline int apic_is_clustered_box(void)
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 0c5ca4e30d7b..f327d386d6cc 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -169,6 +169,7 @@ extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
169extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); 169extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
170 170
171extern int get_nr_irqs_gsi(void); 171extern int get_nr_irqs_gsi(void);
172
172extern void setup_ioapic_ids_from_mpc(void); 173extern void setup_ioapic_ids_from_mpc(void);
173extern void setup_ioapic_ids_from_mpc_nocheck(void); 174extern void setup_ioapic_ids_from_mpc_nocheck(void);
174 175
@@ -183,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi);
183void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); 184void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
184extern void __init pre_init_apic_IRQ0(void); 185extern void __init pre_init_apic_IRQ0(void);
185 186
187extern void mp_save_irq(struct mpc_intsrc *m);
188
186#else /* !CONFIG_X86_IO_APIC */ 189#else /* !CONFIG_X86_IO_APIC */
187 190
188#define io_apic_assign_pci_irqs 0 191#define io_apic_assign_pci_irqs 0
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 17c8090fabd4..ec881c6bfee0 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -852,18 +852,6 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table)
852 * returns 0 on success, < 0 on error 852 * returns 0 on success, < 0 on error
853 */ 853 */
854 854
855static void __init acpi_register_lapic_address(unsigned long address)
856{
857 mp_lapic_addr = address;
858
859 set_fixmap_nocache(FIX_APIC_BASE, address);
860 if (boot_cpu_physical_apicid == -1U) {
861 boot_cpu_physical_apicid = read_apic_id();
862 apic_version[boot_cpu_physical_apicid] =
863 GET_APIC_VERSION(apic_read(APIC_LVR));
864 }
865}
866
867static int __init early_acpi_parse_madt_lapic_addr_ovr(void) 855static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
868{ 856{
869 int count; 857 int count;
@@ -885,7 +873,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
885 return count; 873 return count;
886 } 874 }
887 875
888 acpi_register_lapic_address(acpi_lapic_addr); 876 register_lapic_address(acpi_lapic_addr);
889 877
890 return count; 878 return count;
891} 879}
@@ -912,7 +900,7 @@ static int __init acpi_parse_madt_lapic_entries(void)
912 return count; 900 return count;
913 } 901 }
914 902
915 acpi_register_lapic_address(acpi_lapic_addr); 903 register_lapic_address(acpi_lapic_addr);
916 904
917 count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, 905 count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
918 acpi_parse_sapic, MAX_LOCAL_APIC); 906 acpi_parse_sapic, MAX_LOCAL_APIC);
@@ -954,32 +942,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
954extern int es7000_plat; 942extern int es7000_plat;
955#endif 943#endif
956 944
957static void assign_to_mp_irq(struct mpc_intsrc *m,
958 struct mpc_intsrc *mp_irq)
959{
960 memcpy(mp_irq, m, sizeof(struct mpc_intsrc));
961}
962
963static int mp_irq_cmp(struct mpc_intsrc *mp_irq,
964 struct mpc_intsrc *m)
965{
966 return memcmp(mp_irq, m, sizeof(struct mpc_intsrc));
967}
968
969static void save_mp_irq(struct mpc_intsrc *m)
970{
971 int i;
972
973 for (i = 0; i < mp_irq_entries; i++) {
974 if (!mp_irq_cmp(&mp_irqs[i], m))
975 return;
976 }
977
978 assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
979 if (++mp_irq_entries == MAX_IRQ_SOURCES)
980 panic("Max # of irq sources exceeded!!\n");
981}
982
983void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) 945void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
984{ 946{
985 int ioapic; 947 int ioapic;
@@ -1010,7 +972,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
1010 mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ 972 mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */
1011 mp_irq.dstirq = pin; /* INTIN# */ 973 mp_irq.dstirq = pin; /* INTIN# */
1012 974
1013 save_mp_irq(&mp_irq); 975 mp_save_irq(&mp_irq);
1014 976
1015 isa_irq_to_gsi[bus_irq] = gsi; 977 isa_irq_to_gsi[bus_irq] = gsi;
1016} 978}
@@ -1085,7 +1047,7 @@ void __init mp_config_acpi_legacy_irqs(void)
1085 mp_irq.srcbusirq = i; /* Identity mapped */ 1047 mp_irq.srcbusirq = i; /* Identity mapped */
1086 mp_irq.dstirq = pin; 1048 mp_irq.dstirq = pin;
1087 1049
1088 save_mp_irq(&mp_irq); 1050 mp_save_irq(&mp_irq);
1089 } 1051 }
1090} 1052}
1091 1053
@@ -1122,7 +1084,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,
1122 mp_irq.dstapic = mp_ioapics[ioapic].apicid; 1084 mp_irq.dstapic = mp_ioapics[ioapic].apicid;
1123 mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); 1085 mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
1124 1086
1125 save_mp_irq(&mp_irq); 1087 mp_save_irq(&mp_irq);
1126#endif 1088#endif
1127 return 0; 1089 return 0;
1128} 1090}
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 879999a5230f..ce65d449b750 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1191,12 +1191,15 @@ static void __cpuinit lapic_setup_esr(void)
1191 oldvalue, value); 1191 oldvalue, value);
1192} 1192}
1193 1193
1194
1195/** 1194/**
1196 * setup_local_APIC - setup the local APIC 1195 * setup_local_APIC - setup the local APIC
1196 *
1197 * Used to setup local APIC while initializing BSP or bringin up APs.
1198 * Always called with preemption disabled.
1197 */ 1199 */
1198void __cpuinit setup_local_APIC(void) 1200void __cpuinit setup_local_APIC(void)
1199{ 1201{
1202 int cpu = smp_processor_id();
1200 unsigned int value, queued; 1203 unsigned int value, queued;
1201 int i, j, acked = 0; 1204 int i, j, acked = 0;
1202 unsigned long long tsc = 0, ntsc; 1205 unsigned long long tsc = 0, ntsc;
@@ -1221,8 +1224,6 @@ void __cpuinit setup_local_APIC(void)
1221#endif 1224#endif
1222 perf_events_lapic_init(); 1225 perf_events_lapic_init();
1223 1226
1224 preempt_disable();
1225
1226 /* 1227 /*
1227 * Double-check whether this APIC is really registered. 1228 * Double-check whether this APIC is really registered.
1228 * This is meaningless in clustered apic mode, so we skip it. 1229 * This is meaningless in clustered apic mode, so we skip it.
@@ -1338,21 +1339,19 @@ void __cpuinit setup_local_APIC(void)
1338 * TODO: set up through-local-APIC from through-I/O-APIC? --macro 1339 * TODO: set up through-local-APIC from through-I/O-APIC? --macro
1339 */ 1340 */
1340 value = apic_read(APIC_LVT0) & APIC_LVT_MASKED; 1341 value = apic_read(APIC_LVT0) & APIC_LVT_MASKED;
1341 if (!smp_processor_id() && (pic_mode || !value)) { 1342 if (!cpu && (pic_mode || !value)) {
1342 value = APIC_DM_EXTINT; 1343 value = APIC_DM_EXTINT;
1343 apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", 1344 apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", cpu);
1344 smp_processor_id());
1345 } else { 1345 } else {
1346 value = APIC_DM_EXTINT | APIC_LVT_MASKED; 1346 value = APIC_DM_EXTINT | APIC_LVT_MASKED;
1347 apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", 1347 apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", cpu);
1348 smp_processor_id());
1349 } 1348 }
1350 apic_write(APIC_LVT0, value); 1349 apic_write(APIC_LVT0, value);
1351 1350
1352 /* 1351 /*
1353 * only the BP should see the LINT1 NMI signal, obviously. 1352 * only the BP should see the LINT1 NMI signal, obviously.
1354 */ 1353 */
1355 if (!smp_processor_id()) 1354 if (!cpu)
1356 value = APIC_DM_NMI; 1355 value = APIC_DM_NMI;
1357 else 1356 else
1358 value = APIC_DM_NMI | APIC_LVT_MASKED; 1357 value = APIC_DM_NMI | APIC_LVT_MASKED;
@@ -1360,11 +1359,9 @@ void __cpuinit setup_local_APIC(void)
1360 value |= APIC_LVT_LEVEL_TRIGGER; 1359 value |= APIC_LVT_LEVEL_TRIGGER;
1361 apic_write(APIC_LVT1, value); 1360 apic_write(APIC_LVT1, value);
1362 1361
1363 preempt_enable();
1364
1365#ifdef CONFIG_X86_MCE_INTEL 1362#ifdef CONFIG_X86_MCE_INTEL
1366 /* Recheck CMCI information after local APIC is up on CPU #0 */ 1363 /* Recheck CMCI information after local APIC is up on CPU #0 */
1367 if (smp_processor_id() == 0) 1364 if (!cpu)
1368 cmci_recheck(); 1365 cmci_recheck();
1369#endif 1366#endif
1370} 1367}
@@ -1633,28 +1630,6 @@ no_apic:
1633} 1630}
1634#endif 1631#endif
1635 1632
1636#ifdef CONFIG_X86_64
1637void __init early_init_lapic_mapping(void)
1638{
1639 /*
1640 * If no local APIC can be found then go out
1641 * : it means there is no mpatable and MADT
1642 */
1643 if (!smp_found_config)
1644 return;
1645
1646 set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
1647 apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
1648 APIC_BASE, mp_lapic_addr);
1649
1650 /*
1651 * Fetch the APIC ID of the BSP in case we have a
1652 * default configuration (or the MP table is broken).
1653 */
1654 boot_cpu_physical_apicid = read_apic_id();
1655}
1656#endif
1657
1658/** 1633/**
1659 * init_apic_mappings - initialize APIC mappings 1634 * init_apic_mappings - initialize APIC mappings
1660 */ 1635 */
@@ -1680,10 +1655,7 @@ void __init init_apic_mappings(void)
1680 * acpi_register_lapic_address() 1655 * acpi_register_lapic_address()
1681 */ 1656 */
1682 if (!acpi_lapic && !smp_found_config) 1657 if (!acpi_lapic && !smp_found_config)
1683 set_fixmap_nocache(FIX_APIC_BASE, apic_phys); 1658 register_lapic_address(apic_phys);
1684
1685 apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n",
1686 APIC_BASE, apic_phys);
1687 } 1659 }
1688 1660
1689 /* 1661 /*
@@ -1705,6 +1677,22 @@ void __init init_apic_mappings(void)
1705 } 1677 }
1706} 1678}
1707 1679
1680void __init register_lapic_address(unsigned long address)
1681{
1682 mp_lapic_addr = address;
1683
1684 if (!x2apic_mode) {
1685 set_fixmap_nocache(FIX_APIC_BASE, address);
1686 apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
1687 APIC_BASE, mp_lapic_addr);
1688 }
1689 if (boot_cpu_physical_apicid == -1U) {
1690 boot_cpu_physical_apicid = read_apic_id();
1691 apic_version[boot_cpu_physical_apicid] =
1692 GET_APIC_VERSION(apic_read(APIC_LVR));
1693 }
1694}
1695
1708/* 1696/*
1709 * This initializes the IO-APIC and APIC hardware if this is 1697 * This initializes the IO-APIC and APIC hardware if this is
1710 * a UP kernel. 1698 * a UP kernel.
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index f6cd5b410770..52735a710c30 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -125,6 +125,26 @@ static int __init parse_noapic(char *str)
125} 125}
126early_param("noapic", parse_noapic); 126early_param("noapic", parse_noapic);
127 127
128/* Will be called in mpparse/acpi/sfi codes for saving IRQ info */
129void mp_save_irq(struct mpc_intsrc *m)
130{
131 int i;
132
133 apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
134 " IRQ %02x, APIC ID %x, APIC INT %02x\n",
135 m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
136 m->srcbusirq, m->dstapic, m->dstirq);
137
138 for (i = 0; i < mp_irq_entries; i++) {
139 if (!memcmp(&mp_irqs[i], m, sizeof(*m)))
140 return;
141 }
142
143 memcpy(&mp_irqs[mp_irq_entries], m, sizeof(*m));
144 if (++mp_irq_entries == MAX_IRQ_SOURCES)
145 panic("Max # of irq sources exceeded!!\n");
146}
147
128struct irq_pin_list { 148struct irq_pin_list {
129 int apic, pin; 149 int apic, pin;
130 struct irq_pin_list *next; 150 struct irq_pin_list *next;
@@ -135,6 +155,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node)
135 return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); 155 return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node);
136} 156}
137 157
158
138/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ 159/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
139#ifdef CONFIG_SPARSE_IRQ 160#ifdef CONFIG_SPARSE_IRQ
140static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; 161static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
@@ -2006,9 +2027,12 @@ void __init setup_ioapic_ids_from_mpc_nocheck(void)
2006 = mp_ioapics[apic_id].apicid; 2027 = mp_ioapics[apic_id].apicid;
2007 2028
2008 /* 2029 /*
2009 * Read the right value from the MPC table and 2030 * Update the ID register according to the right value
2010 * write it into the ID register. 2031 * from the MPC table if they are different.
2011 */ 2032 */
2033 if (mp_ioapics[apic_id].apicid == reg_00.bits.ID)
2034 continue;
2035
2012 apic_printk(APIC_VERBOSE, KERN_INFO 2036 apic_printk(APIC_VERBOSE, KERN_INFO
2013 "...changing IO-APIC physical APIC ID to %d ...", 2037 "...changing IO-APIC physical APIC ID to %d ...",
2014 mp_ioapics[apic_id].apicid); 2038 mp_ioapics[apic_id].apicid);
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9af64d9c4b67..01b0f6d06451 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -118,21 +118,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
118 118
119static void __init MP_ioapic_info(struct mpc_ioapic *m) 119static void __init MP_ioapic_info(struct mpc_ioapic *m)
120{ 120{
121 if (!(m->flags & MPC_APIC_USABLE)) 121 if (m->flags & MPC_APIC_USABLE)
122 return; 122 mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
123
124 printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n",
125 m->apicid, m->apicver, m->apicaddr);
126
127 mp_register_ioapic(m->apicid, m->apicaddr, gsi_top);
128}
129
130static void print_MP_intsrc_info(struct mpc_intsrc *m)
131{
132 apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x,"
133 " IRQ %02x, APIC ID %x, APIC INT %02x\n",
134 m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus,
135 m->srcbusirq, m->dstapic, m->dstirq);
136} 123}
137 124
138static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) 125static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
@@ -144,73 +131,11 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq)
144 mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); 131 mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq);
145} 132}
146 133
147static 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
159static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq,
160 struct mpc_intsrc *m)
161{
162 m->dstapic = mp_irq->dstapic;
163 m->type = mp_irq->type;
164 m->irqtype = mp_irq->irqtype;
165 m->irqflag = mp_irq->irqflag;
166 m->srcbus = mp_irq->srcbus;
167 m->srcbusirq = mp_irq->srcbusirq;
168 m->dstirq = mp_irq->dstirq;
169}
170
171static 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
192static 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 */ 134#else /* CONFIG_X86_IO_APIC */
208static inline void __init MP_bus_info(struct mpc_bus *m) {} 135static inline void __init MP_bus_info(struct mpc_bus *m) {}
209static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} 136static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {}
210static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {}
211#endif /* CONFIG_X86_IO_APIC */ 137#endif /* CONFIG_X86_IO_APIC */
212 138
213
214static void __init MP_lintsrc_info(struct mpc_lintsrc *m) 139static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
215{ 140{
216 apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x," 141 apic_printk(APIC_VERBOSE, "Lint: type %d, pol %d, trig %d, bus %02x,"
@@ -222,7 +147,6 @@ static void __init MP_lintsrc_info(struct mpc_lintsrc *m)
222/* 147/*
223 * Read/parse the MPC 148 * Read/parse the MPC
224 */ 149 */
225
226static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str) 150static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str)
227{ 151{
228 152
@@ -275,18 +199,6 @@ static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt)
275 199
276void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { } 200void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { }
277 201
278static void __init smp_register_lapic_address(unsigned long address)
279{
280 mp_lapic_addr = address;
281
282 set_fixmap_nocache(FIX_APIC_BASE, address);
283 if (boot_cpu_physical_apicid == -1U) {
284 boot_cpu_physical_apicid = read_apic_id();
285 apic_version[boot_cpu_physical_apicid] =
286 GET_APIC_VERSION(apic_read(APIC_LVR));
287 }
288}
289
290static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) 202static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
291{ 203{
292 char str[16]; 204 char str[16];
@@ -301,17 +213,13 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
301#ifdef CONFIG_X86_32 213#ifdef CONFIG_X86_32
302 generic_mps_oem_check(mpc, oem, str); 214 generic_mps_oem_check(mpc, oem, str);
303#endif 215#endif
304 /* save the local APIC address, it might be non-default */ 216 /* Initialize the lapic mapping */
305 if (!acpi_lapic) 217 if (!acpi_lapic)
306 mp_lapic_addr = mpc->lapic; 218 register_lapic_address(mpc->lapic);
307 219
308 if (early) 220 if (early)
309 return 1; 221 return 1;
310 222
311 /* Initialize the lapic mapping */
312 if (!acpi_lapic)
313 smp_register_lapic_address(mpc->lapic);
314
315 if (mpc->oemptr) 223 if (mpc->oemptr)
316 x86_init.mpparse.smp_read_mpc_oem(mpc); 224 x86_init.mpparse.smp_read_mpc_oem(mpc);
317 225
@@ -337,7 +245,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
337 skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); 245 skip_entry(&mpt, &count, sizeof(struct mpc_ioapic));
338 break; 246 break;
339 case MP_INTSRC: 247 case MP_INTSRC:
340 MP_intsrc_info((struct mpc_intsrc *)mpt); 248 mp_save_irq((struct mpc_intsrc *)mpt);
341 skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); 249 skip_entry(&mpt, &count, sizeof(struct mpc_intsrc));
342 break; 250 break;
343 case MP_LINTSRC: 251 case MP_LINTSRC:
@@ -429,13 +337,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
429 337
430 intsrc.srcbusirq = i; 338 intsrc.srcbusirq = i;
431 intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ 339 intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */
432 MP_intsrc_info(&intsrc); 340 mp_save_irq(&intsrc);
433 } 341 }
434 342
435 intsrc.irqtype = mp_ExtINT; 343 intsrc.irqtype = mp_ExtINT;
436 intsrc.srcbusirq = 0; 344 intsrc.srcbusirq = 0;
437 intsrc.dstirq = 0; /* 8259A to INTIN0 */ 345 intsrc.dstirq = 0; /* 8259A to INTIN0 */
438 MP_intsrc_info(&intsrc); 346 mp_save_irq(&intsrc);
439} 347}
440 348
441 349
@@ -784,11 +692,11 @@ static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
784 int i; 692 int i;
785 693
786 apic_printk(APIC_VERBOSE, "OLD "); 694 apic_printk(APIC_VERBOSE, "OLD ");
787 print_MP_intsrc_info(m); 695 print_mp_irq_info(m);
788 696
789 i = get_MP_intsrc_index(m); 697 i = get_MP_intsrc_index(m);
790 if (i > 0) { 698 if (i > 0) {
791 assign_to_mpc_intsrc(&mp_irqs[i], m); 699 memcpy(m, &mp_irqs[i], sizeof(*m));
792 apic_printk(APIC_VERBOSE, "NEW "); 700 apic_printk(APIC_VERBOSE, "NEW ");
793 print_mp_irq_info(&mp_irqs[i]); 701 print_mp_irq_info(&mp_irqs[i]);
794 return; 702 return;
@@ -875,14 +783,14 @@ static int __init replace_intsrc_all(struct mpc_table *mpc,
875 if (nr_m_spare > 0) { 783 if (nr_m_spare > 0) {
876 apic_printk(APIC_VERBOSE, "*NEW* found\n"); 784 apic_printk(APIC_VERBOSE, "*NEW* found\n");
877 nr_m_spare--; 785 nr_m_spare--;
878 assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); 786 memcpy(m_spare[nr_m_spare], &mp_irqs[i], sizeof(mp_irqs[i]));
879 m_spare[nr_m_spare] = NULL; 787 m_spare[nr_m_spare] = NULL;
880 } else { 788 } else {
881 struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; 789 struct mpc_intsrc *m = (struct mpc_intsrc *)mpt;
882 count += sizeof(struct mpc_intsrc); 790 count += sizeof(struct mpc_intsrc);
883 if (check_slot(mpc_new_phys, mpc_new_length, count) < 0) 791 if (check_slot(mpc_new_phys, mpc_new_length, count) < 0)
884 goto out; 792 goto out;
885 assign_to_mpc_intsrc(&mp_irqs[i], m); 793 memcpy(m, &mp_irqs[i], sizeof(*m));
886 mpc->length = count; 794 mpc->length = count;
887 mpt += sizeof(struct mpc_intsrc); 795 mpt += sizeof(struct mpc_intsrc);
888 } 796 }
diff --git a/arch/x86/mm/amdtopology_64.c b/arch/x86/mm/amdtopology_64.c
index 51fae9cfdecb..08a0069b87a5 100644
--- a/arch/x86/mm/amdtopology_64.c
+++ b/arch/x86/mm/amdtopology_64.c
@@ -66,7 +66,6 @@ static __init void early_get_boot_cpu_id(void)
66 if (smp_found_config) 66 if (smp_found_config)
67 early_get_smp_config(); 67 early_get_smp_config();
68#endif 68#endif
69 early_init_lapic_mapping();
70} 69}
71 70
72int __init amd_get_nodes(struct bootnode *physnodes) 71int __init amd_get_nodes(struct bootnode *physnodes)
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index fee0b4914e07..ea6529e93c6f 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
71EXPORT_SYMBOL_GPL(sfi_mrtc_array); 71EXPORT_SYMBOL_GPL(sfi_mrtc_array);
72int sfi_mrtc_num; 72int sfi_mrtc_num;
73 73
74static 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
80static 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
86static 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/* parse all the mtimer info to a static mtimer array */ 74/* parse all the mtimer info to a static mtimer array */
101static int __init sfi_parse_mtmr(struct sfi_table_header *table) 75static int __init sfi_parse_mtmr(struct sfi_table_header *table)
102{ 76{
@@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
130 mp_irq.srcbusirq = pentry->irq; /* IRQ */ 104 mp_irq.srcbusirq = pentry->irq; /* IRQ */
131 mp_irq.dstapic = MP_APIC_ALL; 105 mp_irq.dstapic = MP_APIC_ALL;
132 mp_irq.dstirq = pentry->irq; 106 mp_irq.dstirq = pentry->irq;
133 save_mp_irq(&mp_irq); 107 mp_save_irq(&mp_irq);
134 } 108 }
135 109
136 return 0; 110 return 0;
@@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
200 mp_irq.srcbusirq = pentry->irq; /* IRQ */ 174 mp_irq.srcbusirq = pentry->irq; /* IRQ */
201 mp_irq.dstapic = MP_APIC_ALL; 175 mp_irq.dstapic = MP_APIC_ALL;
202 mp_irq.dstirq = pentry->irq; 176 mp_irq.dstirq = pentry->irq;
203 save_mp_irq(&mp_irq); 177 mp_save_irq(&mp_irq);
204 } 178 }
205 return 0; 179 return 0;
206} 180}
diff --git a/arch/x86/platform/sfi/sfi.c b/arch/x86/platform/sfi/sfi.c
index ca54875ac795..7785b72ecc3a 100644
--- a/arch/x86/platform/sfi/sfi.c
+++ b/arch/x86/platform/sfi/sfi.c
@@ -34,17 +34,6 @@
34#ifdef CONFIG_X86_LOCAL_APIC 34#ifdef CONFIG_X86_LOCAL_APIC
35static unsigned long sfi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; 35static unsigned long sfi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
36 36
37static void __init mp_sfi_register_lapic_address(unsigned long address)
38{
39 mp_lapic_addr = address;
40
41 set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
42 if (boot_cpu_physical_apicid == -1U)
43 boot_cpu_physical_apicid = read_apic_id();
44
45 pr_info("Boot CPU = %d\n", boot_cpu_physical_apicid);
46}
47
48/* All CPUs enumerated by SFI must be present and enabled */ 37/* All CPUs enumerated by SFI must be present and enabled */
49static void __cpuinit mp_sfi_register_lapic(u8 id) 38static void __cpuinit mp_sfi_register_lapic(u8 id)
50{ 39{
@@ -110,7 +99,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table)
110int __init sfi_platform_init(void) 99int __init sfi_platform_init(void)
111{ 100{
112#ifdef CONFIG_X86_LOCAL_APIC 101#ifdef CONFIG_X86_LOCAL_APIC
113 mp_sfi_register_lapic_address(sfi_lapic_addr); 102 register_lapic_address(sfi_lapic_addr);
114 sfi_table_parse(SFI_SIG_CPUS, NULL, NULL, sfi_parse_cpus); 103 sfi_table_parse(SFI_SIG_CPUS, NULL, NULL, sfi_parse_cpus);
115#endif 104#endif
116#ifdef CONFIG_X86_IO_APIC 105#ifdef CONFIG_X86_IO_APIC