diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-26 17:28:47 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-26 17:28:47 -0500 |
| commit | fbe6c4047f011d76be83bc2380531cd4fb6aa0e6 (patch) | |
| tree | c4f9bee27e330093fc2d365a2dedc84f1c524124 | |
| parent | d2f30c73aba19be828c759edcd21140390cd06e4 (diff) | |
| parent | 4917b284db8607e414c334317b7d15239854d39c (diff) | |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
dmar, x86: Use function stubs when CONFIG_INTR_REMAP is disabled
x86-64: Fix and clean up AMD Fam10 MMCONF enabling
x86: UV: Address interrupt/IO port operation conflict
x86: Use online node real index in calulate_tbl_offset()
x86, asm: Fix binutils 2.15 build failure
| -rw-r--r-- | arch/x86/include/asm/msr-index.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/uv/uv_hub.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/uv/uv_mmrs.h | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/mmconf-fam10h_64.c | 64 | ||||
| -rw-r--r-- | arch/x86/mm/tlb.c | 5 | ||||
| -rw-r--r-- | arch/x86/platform/uv/tlb_uv.c | 2 | ||||
| -rw-r--r-- | arch/x86/platform/uv/uv_time.c | 4 | ||||
| -rw-r--r-- | include/linux/dmar.h | 17 |
10 files changed, 98 insertions, 46 deletions
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 3ea3dc487047..6b89f5e86021 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
| @@ -128,7 +128,7 @@ | |||
| 128 | #define FAM10H_MMIO_CONF_ENABLE (1<<0) | 128 | #define FAM10H_MMIO_CONF_ENABLE (1<<0) |
| 129 | #define FAM10H_MMIO_CONF_BUSRANGE_MASK 0xf | 129 | #define FAM10H_MMIO_CONF_BUSRANGE_MASK 0xf |
| 130 | #define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2 | 130 | #define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2 |
| 131 | #define FAM10H_MMIO_CONF_BASE_MASK 0xfffffff | 131 | #define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL |
| 132 | #define FAM10H_MMIO_CONF_BASE_SHIFT 20 | 132 | #define FAM10H_MMIO_CONF_BASE_SHIFT 20 |
| 133 | #define MSR_FAM10H_NODE_ID 0xc001100c | 133 | #define MSR_FAM10H_NODE_ID 0xc001100c |
| 134 | 134 | ||
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index e969f691cbfd..a501741c2335 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
| @@ -199,6 +199,8 @@ union uvh_apicid { | |||
| 199 | #define UVH_APICID 0x002D0E00L | 199 | #define UVH_APICID 0x002D0E00L |
| 200 | #define UV_APIC_PNODE_SHIFT 6 | 200 | #define UV_APIC_PNODE_SHIFT 6 |
| 201 | 201 | ||
| 202 | #define UV_APICID_HIBIT_MASK 0xffff0000 | ||
| 203 | |||
| 202 | /* Local Bus from cpu's perspective */ | 204 | /* Local Bus from cpu's perspective */ |
| 203 | #define LOCAL_BUS_BASE 0x1c00000 | 205 | #define LOCAL_BUS_BASE 0x1c00000 |
| 204 | #define LOCAL_BUS_SIZE (4 * 1024 * 1024) | 206 | #define LOCAL_BUS_SIZE (4 * 1024 * 1024) |
| @@ -491,8 +493,10 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
| 491 | } | 493 | } |
| 492 | } | 494 | } |
| 493 | 495 | ||
| 496 | extern unsigned int uv_apicid_hibits; | ||
| 494 | static unsigned long uv_hub_ipi_value(int apicid, int vector, int mode) | 497 | static unsigned long uv_hub_ipi_value(int apicid, int vector, int mode) |
| 495 | { | 498 | { |
| 499 | apicid |= uv_apicid_hibits; | ||
| 496 | return (1UL << UVH_IPI_INT_SEND_SHFT) | | 500 | return (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 497 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | 501 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | |
| 498 | (mode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | 502 | (mode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | |
diff --git a/arch/x86/include/asm/uv/uv_mmrs.h b/arch/x86/include/asm/uv/uv_mmrs.h index 6d90adf4428a..20cafeac7455 100644 --- a/arch/x86/include/asm/uv/uv_mmrs.h +++ b/arch/x86/include/asm/uv/uv_mmrs.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * SGI UV MMR definitions | 6 | * SGI UV MMR definitions |
| 7 | * | 7 | * |
| 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef _ASM_X86_UV_UV_MMRS_H | 11 | #ifndef _ASM_X86_UV_UV_MMRS_H |
| @@ -754,6 +754,23 @@ union uvh_lb_bau_sb_descriptor_base_u { | |||
| 754 | }; | 754 | }; |
| 755 | 755 | ||
| 756 | /* ========================================================================= */ | 756 | /* ========================================================================= */ |
| 757 | /* UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK */ | ||
| 758 | /* ========================================================================= */ | ||
| 759 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK 0x320130UL | ||
| 760 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_32 0x009f0 | ||
| 761 | |||
| 762 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_SHFT 0 | ||
| 763 | #define UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK_BIT_ENABLES_MASK 0x00000000ffffffffUL | ||
| 764 | |||
| 765 | union uvh_lb_target_physical_apic_id_mask_u { | ||
| 766 | unsigned long v; | ||
| 767 | struct uvh_lb_target_physical_apic_id_mask_s { | ||
| 768 | unsigned long bit_enables : 32; /* RW */ | ||
| 769 | unsigned long rsvd_32_63 : 32; /* */ | ||
| 770 | } s; | ||
| 771 | }; | ||
| 772 | |||
| 773 | /* ========================================================================= */ | ||
| 757 | /* UVH_NODE_ID */ | 774 | /* UVH_NODE_ID */ |
| 758 | /* ========================================================================= */ | 775 | /* ========================================================================= */ |
| 759 | #define UVH_NODE_ID 0x0UL | 776 | #define UVH_NODE_ID 0x0UL |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 194539aea175..c1c52c341f40 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -44,6 +44,8 @@ static u64 gru_start_paddr, gru_end_paddr; | |||
| 44 | static union uvh_apicid uvh_apicid; | 44 | static union uvh_apicid uvh_apicid; |
| 45 | int uv_min_hub_revision_id; | 45 | int uv_min_hub_revision_id; |
| 46 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); | 46 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); |
| 47 | unsigned int uv_apicid_hibits; | ||
| 48 | EXPORT_SYMBOL_GPL(uv_apicid_hibits); | ||
| 47 | static DEFINE_SPINLOCK(uv_nmi_lock); | 49 | static DEFINE_SPINLOCK(uv_nmi_lock); |
| 48 | 50 | ||
| 49 | static inline bool is_GRU_range(u64 start, u64 end) | 51 | static inline bool is_GRU_range(u64 start, u64 end) |
| @@ -85,6 +87,23 @@ static void __init early_get_apic_pnode_shift(void) | |||
| 85 | uvh_apicid.s.pnode_shift = UV_APIC_PNODE_SHIFT; | 87 | uvh_apicid.s.pnode_shift = UV_APIC_PNODE_SHIFT; |
| 86 | } | 88 | } |
| 87 | 89 | ||
| 90 | /* | ||
| 91 | * Add an extra bit as dictated by bios to the destination apicid of | ||
| 92 | * interrupts potentially passing through the UV HUB. This prevents | ||
| 93 | * a deadlock between interrupts and IO port operations. | ||
| 94 | */ | ||
| 95 | static void __init uv_set_apicid_hibit(void) | ||
| 96 | { | ||
| 97 | union uvh_lb_target_physical_apic_id_mask_u apicid_mask; | ||
| 98 | unsigned long *mmr; | ||
| 99 | |||
| 100 | mmr = early_ioremap(UV_LOCAL_MMR_BASE | | ||
| 101 | UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK, sizeof(*mmr)); | ||
| 102 | apicid_mask.v = *mmr; | ||
| 103 | early_iounmap(mmr, sizeof(*mmr)); | ||
| 104 | uv_apicid_hibits = apicid_mask.s.bit_enables & UV_APICID_HIBIT_MASK; | ||
| 105 | } | ||
| 106 | |||
| 88 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 107 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
| 89 | { | 108 | { |
| 90 | int nodeid; | 109 | int nodeid; |
| @@ -102,6 +121,7 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
| 102 | __get_cpu_var(x2apic_extra_bits) = | 121 | __get_cpu_var(x2apic_extra_bits) = |
| 103 | nodeid << (uvh_apicid.s.pnode_shift - 1); | 122 | nodeid << (uvh_apicid.s.pnode_shift - 1); |
| 104 | uv_system_type = UV_NON_UNIQUE_APIC; | 123 | uv_system_type = UV_NON_UNIQUE_APIC; |
| 124 | uv_set_apicid_hibit(); | ||
| 105 | return 1; | 125 | return 1; |
| 106 | } | 126 | } |
| 107 | } | 127 | } |
| @@ -155,6 +175,7 @@ static int __cpuinit uv_wakeup_secondary(int phys_apicid, unsigned long start_ri | |||
| 155 | int pnode; | 175 | int pnode; |
| 156 | 176 | ||
| 157 | pnode = uv_apicid_to_pnode(phys_apicid); | 177 | pnode = uv_apicid_to_pnode(phys_apicid); |
| 178 | phys_apicid |= uv_apicid_hibits; | ||
| 158 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | 179 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 159 | (phys_apicid << UVH_IPI_INT_APIC_ID_SHFT) | | 180 | (phys_apicid << UVH_IPI_INT_APIC_ID_SHFT) | |
| 160 | ((start_rip << UVH_IPI_INT_VECTOR_SHFT) >> 12) | | 181 | ((start_rip << UVH_IPI_INT_VECTOR_SHFT) >> 12) | |
| @@ -236,7 +257,7 @@ static unsigned int uv_cpu_mask_to_apicid(const struct cpumask *cpumask) | |||
| 236 | int cpu = cpumask_first(cpumask); | 257 | int cpu = cpumask_first(cpumask); |
| 237 | 258 | ||
| 238 | if ((unsigned)cpu < nr_cpu_ids) | 259 | if ((unsigned)cpu < nr_cpu_ids) |
| 239 | return per_cpu(x86_cpu_to_apicid, cpu); | 260 | return per_cpu(x86_cpu_to_apicid, cpu) | uv_apicid_hibits; |
| 240 | else | 261 | else |
| 241 | return BAD_APICID; | 262 | return BAD_APICID; |
| 242 | } | 263 | } |
| @@ -255,7 +276,7 @@ uv_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 255 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | 276 | if (cpumask_test_cpu(cpu, cpu_online_mask)) |
| 256 | break; | 277 | break; |
| 257 | } | 278 | } |
| 258 | return per_cpu(x86_cpu_to_apicid, cpu); | 279 | return per_cpu(x86_cpu_to_apicid, cpu) | uv_apicid_hibits; |
| 259 | } | 280 | } |
| 260 | 281 | ||
| 261 | static unsigned int x2apic_get_apic_id(unsigned long x) | 282 | static unsigned int x2apic_get_apic_id(unsigned long x) |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 59e175e89599..591e60104278 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -395,7 +395,7 @@ sysenter_past_esp: | |||
| 395 | * A tiny bit of offset fixup is necessary - 4*4 means the 4 words | 395 | * A tiny bit of offset fixup is necessary - 4*4 means the 4 words |
| 396 | * pushed above; +8 corresponds to copy_thread's esp0 setting. | 396 | * pushed above; +8 corresponds to copy_thread's esp0 setting. |
