diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2010-12-09 12:17:25 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2010-12-09 12:17:25 -0500 |
commit | d834a9dcecae834cd6b2bc5e50e1907738d9cf6a (patch) | |
tree | 0589d753465d3fe359ba451ba6cb7798df03aaa2 /arch/x86/kernel/apic | |
parent | a38c5380ef9f088be9f49b6e4c5d80af8b1b5cd4 (diff) | |
parent | f658bcfb2607bf0808966a69cf74135ce98e5c2d (diff) |
Merge branch 'x86/amd-nb' into x86/apic-cleanups
Reason: apic cleanup series depends on x86/apic, x86/amd-nb x86/platform
Conflicts:
arch/x86/include/asm/io_apic.h
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/apic')
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 36 |
3 files changed, 36 insertions, 12 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 463839645f9b..c48a64510844 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -52,7 +52,6 @@ | |||
52 | #include <asm/mce.h> | 52 | #include <asm/mce.h> |
53 | #include <asm/kvm_para.h> | 53 | #include <asm/kvm_para.h> |
54 | #include <asm/tsc.h> | 54 | #include <asm/tsc.h> |
55 | #include <asm/atomic.h> | ||
56 | 55 | ||
57 | unsigned int num_processors; | 56 | unsigned int num_processors; |
58 | 57 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 4f026a632c95..4abf08aab3d4 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -3113,7 +3113,7 @@ void destroy_irq(unsigned int irq) | |||
3113 | 3113 | ||
3114 | irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); | 3114 | irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); |
3115 | 3115 | ||
3116 | if (intr_remapping_enabled) | 3116 | if (irq_remapped(cfg)) |
3117 | free_irte(irq); | 3117 | free_irte(irq); |
3118 | raw_spin_lock_irqsave(&vector_lock, flags); | 3118 | raw_spin_lock_irqsave(&vector_lock, flags); |
3119 | __clear_irq_vector(irq, cfg); | 3119 | __clear_irq_vector(irq, cfg); |
@@ -3335,7 +3335,7 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | |||
3335 | return 0; | 3335 | return 0; |
3336 | } | 3336 | } |
3337 | 3337 | ||
3338 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 3338 | int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
3339 | { | 3339 | { |
3340 | int node, ret, sub_handle, index = 0; | 3340 | int node, ret, sub_handle, index = 0; |
3341 | unsigned int irq, irq_want; | 3341 | unsigned int irq, irq_want; |
@@ -3393,7 +3393,7 @@ error: | |||
3393 | return ret; | 3393 | return ret; |
3394 | } | 3394 | } |
3395 | 3395 | ||
3396 | void arch_teardown_msi_irq(unsigned int irq) | 3396 | void native_teardown_msi_irq(unsigned int irq) |
3397 | { | 3397 | { |
3398 | destroy_irq(irq); | 3398 | destroy_irq(irq); |
3399 | } | 3399 | } |
@@ -3654,6 +3654,11 @@ static void __init probe_nr_irqs_gsi(void) | |||
3654 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); | 3654 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); |
3655 | } | 3655 | } |
3656 | 3656 | ||
3657 | int get_nr_irqs_gsi(void) | ||
3658 | { | ||
3659 | return nr_irqs_gsi; | ||
3660 | } | ||
3661 | |||
3657 | #ifdef CONFIG_SPARSE_IRQ | 3662 | #ifdef CONFIG_SPARSE_IRQ |
3658 | int __init arch_probe_nr_irqs(void) | 3663 | int __init arch_probe_nr_irqs(void) |
3659 | { | 3664 | { |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f744f54cb248..194539aea175 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * SGI UV APIC functions (note: not an Intel compatible APIC) | 6 | * SGI UV APIC functions (note: not an Intel compatible APIC) |
7 | * | 7 | * |
8 | * Copyright (C) 2007-2009 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. |
9 | */ | 9 | */ |
10 | #include <linux/cpumask.h> | 10 | #include <linux/cpumask.h> |
11 | #include <linux/hardirq.h> | 11 | #include <linux/hardirq.h> |
@@ -41,6 +41,7 @@ DEFINE_PER_CPU(int, x2apic_extra_bits); | |||
41 | 41 | ||
42 | static enum uv_system_type uv_system_type; | 42 | static enum uv_system_type uv_system_type; |
43 | static u64 gru_start_paddr, gru_end_paddr; | 43 | static u64 gru_start_paddr, gru_end_paddr; |
44 | static union uvh_apicid uvh_apicid; | ||
44 | int uv_min_hub_revision_id; | 45 | int uv_min_hub_revision_id; |
45 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); | 46 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); |
46 | static DEFINE_SPINLOCK(uv_nmi_lock); | 47 | static DEFINE_SPINLOCK(uv_nmi_lock); |
@@ -70,12 +71,27 @@ static int early_get_nodeid(void) | |||
70 | return node_id.s.node_id; | 71 | return node_id.s.node_id; |
71 | } | 72 | } |
72 | 73 | ||
74 | static void __init early_get_apic_pnode_shift(void) | ||
75 | { | ||
76 | unsigned long *mmr; | ||
77 | |||
78 | mmr = early_ioremap(UV_LOCAL_MMR_BASE | UVH_APICID, sizeof(*mmr)); | ||
79 | uvh_apicid.v = *mmr; | ||
80 | early_iounmap(mmr, sizeof(*mmr)); | ||
81 | if (!uvh_apicid.v) | ||
82 | /* | ||
83 | * Old bios, use default value | ||
84 | */ | ||
85 | uvh_apicid.s.pnode_shift = UV_APIC_PNODE_SHIFT; | ||
86 | } | ||
87 | |||
73 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 88 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
74 | { | 89 | { |
75 | int nodeid; | 90 | int nodeid; |
76 | 91 | ||
77 | if (!strcmp(oem_id, "SGI")) { | 92 | if (!strcmp(oem_id, "SGI")) { |
78 | nodeid = early_get_nodeid(); | 93 | nodeid = early_get_nodeid(); |
94 | early_get_apic_pnode_shift(); | ||
79 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; | 95 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; |
80 | x86_platform.nmi_init = uv_nmi_init; | 96 | x86_platform.nmi_init = uv_nmi_init; |
81 | if (!strcmp(oem_table_id, "UVL")) | 97 | if (!strcmp(oem_table_id, "UVL")) |
@@ -84,7 +100,7 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
84 | uv_system_type = UV_X2APIC; | 100 | uv_system_type = UV_X2APIC; |
85 | else if (!strcmp(oem_table_id, "UVH")) { | 101 | else if (!strcmp(oem_table_id, "UVH")) { |
86 | __get_cpu_var(x2apic_extra_bits) = | 102 | __get_cpu_var(x2apic_extra_bits) = |
87 | nodeid << (UV_APIC_PNODE_SHIFT - 1); | 103 | nodeid << (uvh_apicid.s.pnode_shift - 1); |
88 | uv_system_type = UV_NON_UNIQUE_APIC; | 104 | uv_system_type = UV_NON_UNIQUE_APIC; |
89 | return 1; | 105 | return 1; |
90 | } | 106 | } |
@@ -363,14 +379,14 @@ struct redir_addr { | |||
363 | #define DEST_SHIFT UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT | 379 | #define DEST_SHIFT UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT |
364 | 380 | ||
365 | static __initdata struct redir_addr redir_addrs[] = { | 381 | static __initdata struct redir_addr redir_addrs[] = { |
366 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR, UVH_SI_ALIAS0_OVERLAY_CONFIG}, | 382 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR, UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR}, |
367 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR, UVH_SI_ALIAS1_OVERLAY_CONFIG}, | 383 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR, UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR}, |
368 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_SI_ALIAS2_OVERLAY_CONFIG}, | 384 | {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR}, |
369 | }; | 385 | }; |
370 | 386 | ||
371 | static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | 387 | static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) |
372 | { | 388 | { |
373 | union uvh_si_alias0_overlay_config_u alias; | 389 | union uvh_rh_gam_alias210_overlay_config_2_mmr_u alias; |
374 | union uvh_rh_gam_alias210_redirect_config_2_mmr_u redirect; | 390 | union uvh_rh_gam_alias210_redirect_config_2_mmr_u redirect; |
375 | int i; | 391 | int i; |
376 | 392 | ||
@@ -644,7 +660,7 @@ void uv_nmi_init(void) | |||
644 | 660 | ||
645 | void __init uv_system_init(void) | 661 | void __init uv_system_init(void) |
646 | { | 662 | { |
647 | union uvh_si_addr_map_config_u m_n_config; | 663 | union uvh_rh_gam_config_mmr_u m_n_config; |
648 | union uvh_node_id_u node_id; | 664 | union uvh_node_id_u node_id; |
649 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; | 665 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; |
650 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; | 666 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; |
@@ -654,7 +670,7 @@ void __init uv_system_init(void) | |||
654 | 670 | ||
655 | map_low_mmrs(); | 671 | map_low_mmrs(); |
656 | 672 | ||
657 | m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); | 673 | m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR ); |
658 | m_val = m_n_config.s.m_skt; | 674 | m_val = m_n_config.s.m_skt; |
659 | n_val = m_n_config.s.n_skt; | 675 | n_val = m_n_config.s.n_skt; |
660 | mmr_base = | 676 | mmr_base = |
@@ -716,6 +732,10 @@ void __init uv_system_init(void) | |||
716 | int apicid = per_cpu(x86_cpu_to_apicid, cpu); | 732 | int apicid = per_cpu(x86_cpu_to_apicid, cpu); |
717 | 733 | ||
718 | nid = cpu_to_node(cpu); | 734 | nid = cpu_to_node(cpu); |
735 | /* | ||
736 | * apic_pnode_shift must be set before calling uv_apicid_to_pnode(); | ||
737 | */ | ||
738 | uv_cpu_hub_info(cpu)->apic_pnode_shift = uvh_apicid.s.pnode_shift; | ||
719 | pnode = uv_apicid_to_pnode(apicid); | 739 | pnode = uv_apicid_to_pnode(apicid); |
720 | blade = boot_pnode_to_blade(pnode); | 740 | blade = boot_pnode_to_blade(pnode); |
721 | lcpu = uv_blade_info[blade].nr_possible_cpus; | 741 | lcpu = uv_blade_info[blade].nr_possible_cpus; |