diff options
Diffstat (limited to 'arch/x86/kernel/apic')
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 23 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/apic/nmi.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/probe_32.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 15 |
6 files changed, 34 insertions, 18 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index ee75d2a9b9cd..8c7c042ecad1 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -14,6 +14,7 @@ | |||
14 | * Mikael Pettersson : PM converted to driver model. | 14 | * Mikael Pettersson : PM converted to driver model. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <linux/perf_counter.h> | ||
17 | #include <linux/kernel_stat.h> | 18 | #include <linux/kernel_stat.h> |
18 | #include <linux/mc146818rtc.h> | 19 | #include <linux/mc146818rtc.h> |
19 | #include <linux/acpi_pmtmr.h> | 20 | #include <linux/acpi_pmtmr.h> |
@@ -34,6 +35,7 @@ | |||
34 | #include <linux/smp.h> | 35 | #include <linux/smp.h> |
35 | #include <linux/mm.h> | 36 | #include <linux/mm.h> |
36 | 37 | ||
38 | #include <asm/perf_counter.h> | ||
37 | #include <asm/pgalloc.h> | 39 | #include <asm/pgalloc.h> |
38 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
39 | #include <asm/mpspec.h> | 41 | #include <asm/mpspec.h> |
@@ -249,7 +251,7 @@ static void native_apic_write_dummy(u32 reg, u32 v) | |||
249 | 251 | ||
250 | static u32 native_apic_read_dummy(u32 reg) | 252 | static u32 native_apic_read_dummy(u32 reg) |
251 | { | 253 | { |
252 | WARN_ON_ONCE((cpu_has_apic || !disable_apic)); | 254 | WARN_ON_ONCE((cpu_has_apic && !disable_apic)); |
253 | return 0; | 255 | return 0; |
254 | } | 256 | } |
255 | 257 | ||
@@ -1187,6 +1189,7 @@ void __cpuinit setup_local_APIC(void) | |||
1187 | apic_write(APIC_ESR, 0); | 1189 | apic_write(APIC_ESR, 0); |
1188 | } | 1190 | } |
1189 | #endif | 1191 | #endif |
1192 | perf_counters_lapic_init(); | ||
1190 | 1193 | ||
1191 | preempt_disable(); | 1194 | preempt_disable(); |
1192 | 1195 | ||
@@ -1609,6 +1612,13 @@ void __init init_apic_mappings(void) | |||
1609 | new_apicid = read_apic_id(); | 1612 | new_apicid = read_apic_id(); |
1610 | if (boot_cpu_physical_apicid != new_apicid) { | 1613 | if (boot_cpu_physical_apicid != new_apicid) { |
1611 | boot_cpu_physical_apicid = new_apicid; | 1614 | boot_cpu_physical_apicid = new_apicid; |
1615 | /* | ||
1616 | * yeah -- we lie about apic_version | ||
1617 | * in case if apic was disabled via boot option | ||
1618 | * but it's not a problem for SMP compiled kernel | ||
1619 | * since smp_sanity_check is prepared for such a case | ||
1620 | * and disable smp mode | ||
1621 | */ | ||
1612 | apic_version[new_apicid] = | 1622 | apic_version[new_apicid] = |
1613 | GET_APIC_VERSION(apic_read(APIC_LVR)); | 1623 | GET_APIC_VERSION(apic_read(APIC_LVR)); |
1614 | } | 1624 | } |
@@ -2027,7 +2037,7 @@ static int lapic_resume(struct sys_device *dev) | |||
2027 | unsigned int l, h; | 2037 | unsigned int l, h; |
2028 | unsigned long flags; | 2038 | unsigned long flags; |
2029 | int maxlvt; | 2039 | int maxlvt; |
2030 | int ret; | 2040 | int ret = 0; |
2031 | struct IO_APIC_route_entry **ioapic_entries = NULL; | 2041 | struct IO_APIC_route_entry **ioapic_entries = NULL; |
2032 | 2042 | ||
2033 | if (!apic_pm_state.active) | 2043 | if (!apic_pm_state.active) |
@@ -2038,14 +2048,15 @@ static int lapic_resume(struct sys_device *dev) | |||
2038 | ioapic_entries = alloc_ioapic_entries(); | 2048 | ioapic_entries = alloc_ioapic_entries(); |
2039 | if (!ioapic_entries) { | 2049 | if (!ioapic_entries) { |
2040 | WARN(1, "Alloc ioapic_entries in lapic resume failed."); | 2050 | WARN(1, "Alloc ioapic_entries in lapic resume failed."); |
2041 | return -ENOMEM; | 2051 | ret = -ENOMEM; |
2052 | goto restore; | ||
2042 | } | 2053 | } |
2043 | 2054 | ||
2044 | ret = save_IO_APIC_setup(ioapic_entries); | 2055 | ret = save_IO_APIC_setup(ioapic_entries); |
2045 | if (ret) { | 2056 | if (ret) { |
2046 | WARN(1, "Saving IO-APIC state failed: %d\n", ret); | 2057 | WARN(1, "Saving IO-APIC state failed: %d\n", ret); |
2047 | free_ioapic_entries(ioapic_entries); | 2058 | free_ioapic_entries(ioapic_entries); |
2048 | return ret; | 2059 | goto restore; |
2049 | } | 2060 | } |
2050 | 2061 | ||
2051 | mask_IO_APIC_setup(ioapic_entries); | 2062 | mask_IO_APIC_setup(ioapic_entries); |
@@ -2097,10 +2108,10 @@ static int lapic_resume(struct sys_device *dev) | |||
2097 | restore_IO_APIC_setup(ioapic_entries); | 2108 | restore_IO_APIC_setup(ioapic_entries); |
2098 | free_ioapic_entries(ioapic_entries); | 2109 | free_ioapic_entries(ioapic_entries); |
2099 | } | 2110 | } |
2100 | 2111 | restore: | |
2101 | local_irq_restore(flags); | 2112 | local_irq_restore(flags); |
2102 | 2113 | ||
2103 | return 0; | 2114 | return ret; |
2104 | } | 2115 | } |
2105 | 2116 | ||
2106 | /* | 2117 | /* |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index ac7f3b6ad583..94605e7f6a54 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #include <asm/setup.h> | 59 | #include <asm/setup.h> |
60 | #include <asm/irq_remapping.h> | 60 | #include <asm/irq_remapping.h> |
61 | #include <asm/hpet.h> | 61 | #include <asm/hpet.h> |
62 | #include <asm/hw_irq.h> | ||
62 | #include <asm/uv/uv_hub.h> | 63 | #include <asm/uv/uv_hub.h> |
63 | #include <asm/uv/uv_irq.h> | 64 | #include <asm/uv/uv_irq.h> |
64 | 65 | ||
@@ -176,16 +177,18 @@ int __init arch_early_irq_init(void) | |||
176 | struct irq_cfg *cfg; | 177 | struct irq_cfg *cfg; |
177 | struct irq_desc *desc; | 178 | struct irq_desc *desc; |
178 | int count; | 179 | int count; |
180 | int node; | ||
179 | int i; | 181 | int i; |
180 | 182 | ||
181 | cfg = irq_cfgx; | 183 | cfg = irq_cfgx; |
182 | count = ARRAY_SIZE(irq_cfgx); | 184 | count = ARRAY_SIZE(irq_cfgx); |
185 | node= cpu_to_node(boot_cpu_id); | ||
183 | 186 | ||
184 | for (i = 0; i < count; i++) { | 187 | for (i = 0; i < count; i++) { |
185 | desc = irq_to_desc(i); | 188 | desc = irq_to_desc(i); |
186 | desc->chip_data = &cfg[i]; | 189 | desc->chip_data = &cfg[i]; |
187 | alloc_bootmem_cpumask_var(&cfg[i].domain); | 190 | alloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node); |
188 | alloc_bootmem_cpumask_var(&cfg[i].old_domain); | 191 | alloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node); |
189 | if (i < NR_IRQS_LEGACY) | 192 | if (i < NR_IRQS_LEGACY) |
190 | cpumask_setall(cfg[i].domain); | 193 | cpumask_setall(cfg[i].domain); |
191 | } | 194 | } |
@@ -4012,6 +4015,7 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id) | |||
4012 | 4015 | ||
4013 | return apic_id; | 4016 | return apic_id; |
4014 | } | 4017 | } |
4018 | #endif | ||
4015 | 4019 | ||
4016 | int __init io_apic_get_version(int ioapic) | 4020 | int __init io_apic_get_version(int ioapic) |
4017 | { | 4021 | { |
@@ -4024,7 +4028,6 @@ int __init io_apic_get_version(int ioapic) | |||
4024 | 4028 | ||
4025 | return reg_01.bits.version; | 4029 | return reg_01.bits.version; |
4026 | } | 4030 | } |
4027 | #endif | ||
4028 | 4031 | ||
4029 | int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | 4032 | int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) |
4030 | { | 4033 | { |
diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c index c4762276c17e..b3025b43b63a 100644 --- a/arch/x86/kernel/apic/nmi.c +++ b/arch/x86/kernel/apic/nmi.c | |||
@@ -104,7 +104,7 @@ static __init void nmi_cpu_busy(void *data) | |||
104 | } | 104 | } |
105 | #endif | 105 | #endif |
106 | 106 | ||
107 | static void report_broken_nmi(int cpu, int *prev_nmi_count) | 107 | static void report_broken_nmi(int cpu, unsigned int *prev_nmi_count) |
108 | { | 108 | { |
109 | printk(KERN_CONT "\n"); | 109 | printk(KERN_CONT "\n"); |
110 | 110 | ||
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index 01eda2ac65e4..440a8bccd91a 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c | |||
@@ -160,7 +160,6 @@ extern struct apic apic_summit; | |||
160 | extern struct apic apic_bigsmp; | 160 | extern struct apic apic_bigsmp; |
161 | extern struct apic apic_es7000; | 161 | extern struct apic apic_es7000; |
162 | extern struct apic apic_es7000_cluster; | 162 | extern struct apic apic_es7000_cluster; |
163 | extern struct apic apic_default; | ||
164 | 163 | ||
165 | struct apic *apic = &apic_default; | 164 | struct apic *apic = &apic_default; |
166 | EXPORT_SYMBOL_GPL(apic); | 165 | EXPORT_SYMBOL_GPL(apic); |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 4a903e2f0d17..8e4cbb255c38 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <asm/apic.h> | 10 | #include <asm/apic.h> |
11 | #include <asm/ipi.h> | 11 | #include <asm/ipi.h> |
12 | 12 | ||
13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); | 13 | static DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); |
14 | 14 | ||
15 | static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 15 | static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
16 | { | 16 | { |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 780a733a5e7a..ef0ae207a7c8 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -562,7 +562,7 @@ void __init uv_system_init(void) | |||
562 | union uvh_node_id_u node_id; | 562 | union uvh_node_id_u node_id; |
563 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; | 563 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; |
564 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; | 564 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; |
565 | int max_pnode = 0; | 565 | int gnode_extra, max_pnode = 0; |
566 | unsigned long mmr_base, present, paddr; | 566 | unsigned long mmr_base, present, paddr; |
567 | unsigned short pnode_mask; | 567 | unsigned short pnode_mask; |
568 | 568 | ||
@@ -574,6 +574,13 @@ void __init uv_system_init(void) | |||
574 | mmr_base = | 574 | mmr_base = |
575 | uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & | 575 | uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & |
576 | ~UV_MMR_ENABLE; | 576 | ~UV_MMR_ENABLE; |
577 | pnode_mask = (1 << n_val) - 1; | ||
578 | node_id.v = uv_read_local_mmr(UVH_NODE_ID); | ||
579 | gnode_extra = (node_id.s.node_id & ~((1 << n_val) - 1)) >> 1; | ||
580 | gnode_upper = ((unsigned long)gnode_extra << m_val); | ||
581 | printk(KERN_DEBUG "UV: N %d, M %d, gnode_upper 0x%lx, gnode_extra 0x%x\n", | ||
582 | n_val, m_val, gnode_upper, gnode_extra); | ||
583 | |||
577 | printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base); | 584 | printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base); |
578 | 585 | ||
579 | for(i = 0; i < UVH_NODE_PRESENT_TABLE_DEPTH; i++) | 586 | for(i = 0; i < UVH_NODE_PRESENT_TABLE_DEPTH; i++) |
@@ -610,11 +617,6 @@ void __init uv_system_init(void) | |||
610 | } | 617 | } |
611 | } | 618 | } |
612 | 619 | ||
613 | pnode_mask = (1 << n_val) - 1; | ||
614 | node_id.v = uv_read_local_mmr(UVH_NODE_ID); | ||
615 | gnode_upper = (((unsigned long)node_id.s.node_id) & | ||
616 | ~((1 << n_val) - 1)) << m_val; | ||
617 | |||
618 | uv_bios_init(); | 620 | uv_bios_init(); |
619 | uv_bios_get_sn_info(0, &uv_type, &sn_partition_id, | 621 | uv_bios_get_sn_info(0, &uv_type, &sn_partition_id, |
620 | &sn_coherency_id, &sn_region_size); | 622 | &sn_coherency_id, &sn_region_size); |
@@ -637,6 +639,7 @@ void __init uv_system_init(void) | |||
637 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 639 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
638 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 640 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; |
639 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 641 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
642 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; | ||
640 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 643 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
641 | uv_cpu_hub_info(cpu)->coherency_domain_number = sn_coherency_id; | 644 | uv_cpu_hub_info(cpu)->coherency_domain_number = sn_coherency_id; |
642 | uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu; | 645 | uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu; |