diff options
| -rw-r--r-- | arch/x86/boot/setup.ld | 3 | ||||
| -rw-r--r-- | arch/x86/include/asm/uv/uv_hub.h | 23 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/realmode/wakeup.lds.S | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/tlb_uv.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux.lds.S | 3 |
7 files changed, 40 insertions, 12 deletions
diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld index 0f6ec455a2b1..03c0683636b6 100644 --- a/arch/x86/boot/setup.ld +++ b/arch/x86/boot/setup.ld | |||
| @@ -53,6 +53,9 @@ SECTIONS | |||
| 53 | 53 | ||
| 54 | /DISCARD/ : { *(.note*) } | 54 | /DISCARD/ : { *(.note*) } |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 58 | */ | ||
| 56 | . = ASSERT(_end <= 0x8000, "Setup too big!"); | 59 | . = ASSERT(_end <= 0x8000, "Setup too big!"); |
| 57 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); | 60 | . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!"); |
| 58 | /* Necessary for the very-old-loader check to work... */ | 61 | /* Necessary for the very-old-loader check to work... */ |
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 04eb6c958b9d..d1414af98559 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | #include <asm/types.h> | 19 | #include <asm/types.h> |
| 20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 21 | #include <asm/uv/uv_mmrs.h> | 21 | #include <asm/uv/uv_mmrs.h> |
| 22 | #include <asm/irq_vectors.h> | ||
| 23 | #include <asm/io_apic.h> | ||
| 22 | 24 | ||
| 23 | 25 | ||
| 24 | /* | 26 | /* |
| @@ -114,7 +116,7 @@ | |||
| 114 | /* | 116 | /* |
| 115 | * The largest possible NASID of a C or M brick (+ 2) | 117 | * The largest possible NASID of a C or M brick (+ 2) |
| 116 | */ | 118 | */ |
| 117 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_NODES * 2) | 119 | #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_BLADES * 2) |
| 118 | 120 | ||
| 119 | struct uv_scir_s { | 121 | struct uv_scir_s { |
| 120 | struct timer_list timer; | 122 | struct timer_list timer; |
| @@ -230,6 +232,20 @@ static inline unsigned long uv_gpa(void *v) | |||
| 230 | return uv_soc_phys_ram_to_gpa(__pa(v)); | 232 | return uv_soc_phys_ram_to_gpa(__pa(v)); |
| 231 | } | 233 | } |
| 232 | 234 | ||
| 235 | /* gnode -> pnode */ | ||
| 236 | static inline unsigned long uv_gpa_to_gnode(unsigned long gpa) | ||
| 237 | { | ||
| 238 | return gpa >> uv_hub_info->m_val; | ||
| 239 | } | ||
| 240 | |||
| 241 | /* gpa -> pnode */ | ||
| 242 | static inline int uv_gpa_to_pnode(unsigned long gpa) | ||
| 243 | { | ||
| 244 | unsigned long n_mask = (1UL << uv_hub_info->n_val) - 1; | ||
| 245 | |||
| 246 | return uv_gpa_to_gnode(gpa) & n_mask; | ||
| 247 | } | ||
| 248 | |||
| 233 | /* pnode, offset --> socket virtual */ | 249 | /* pnode, offset --> socket virtual */ |
| 234 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) | 250 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) |
| 235 | { | 251 | { |
| @@ -421,9 +437,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
| 421 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | 437 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) |
| 422 | { | 438 | { |
| 423 | unsigned long val; | 439 | unsigned long val; |
| 440 | unsigned long dmode = dest_Fixed; | ||
| 441 | |||
| 442 | if (vector == NMI_VECTOR) | ||
| 443 | dmode = dest_NMI; | ||
| 424 | 444 | ||
| 425 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | 445 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 426 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | 446 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | |
| 447 | (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | ||
| 427 | (vector << UVH_IPI_INT_VECTOR_SHFT); | 448 | (vector << UVH_IPI_INT_VECTOR_SHFT); |
| 428 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | 449 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
| 429 | } | 450 | } |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S b/arch/x86/kernel/acpi/realmode/wakeup.lds.S index 7da00b799cda..060fff8f5c5b 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S | |||
| @@ -57,5 +57,8 @@ SECTIONS | |||
| 57 | *(.note*) | 57 | *(.note*) |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | /* | ||
| 61 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 62 | */ | ||
| 60 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); | 63 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); |
| 61 | } | 64 | } |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f5f5886a6b53..326c25477d3d 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | |||
| 352 | 352 | ||
| 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { | 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { |
| 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); | 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); |
| 355 | if (alias.s.base == 0) { | 355 | if (alias.s.enable && alias.s.base == 0) { |
| 356 | *size = (1UL << alias.s.m_alias); | 356 | *size = (1UL << alias.s.m_alias); |
| 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); | 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); |
| 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; | 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; |
| 359 | return; | 359 | return; |
| 360 | } | 360 | } |
| 361 | } | 361 | } |
| 362 | BUG(); | 362 | *base = *size = 0; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | enum map_type {map_wb, map_uc}; | 365 | enum map_type {map_wb, map_uc}; |
| @@ -619,12 +619,12 @@ void __init uv_system_init(void) | |||
| 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; | 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; |
| 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; | 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; |
| 621 | uv_cpu_hub_info(cpu)->m_val = m_val; | 621 | uv_cpu_hub_info(cpu)->m_val = m_val; |
| 622 | uv_cpu_hub_info(cpu)->n_val = m_val; | 622 | uv_cpu_hub_info(cpu)->n_val = n_val; |
| 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; | 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; |
| 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; | 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; |
| 625 | uv_cpu_hub_info(cpu)->pnode = pnode; | 625 | uv_cpu_hub_info(cpu)->pnode = pnode; |
| 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
| 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1; |
| 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
| 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; | 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; |
| 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b1598a9436d0..721a77ca8115 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1214,7 +1214,8 @@ static int __cpuinit mce_cap_init(void) | |||
| 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); | 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); |
| 1215 | 1215 | ||
| 1216 | b = cap & MCG_BANKCNT_MASK; | 1216 | b = cap & MCG_BANKCNT_MASK; |
| 1217 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | 1217 | if (!banks) |
| 1218 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | ||
| 1218 | 1219 | ||
| 1219 | if (b > MAX_NR_BANKS) { | 1220 | if (b > MAX_NR_BANKS) { |
| 1220 | printk(KERN_WARNING | 1221 | printk(KERN_WARNING |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 503c1f2e8835..1740c85e24bb 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | static struct bau_control **uv_bau_table_bases __read_mostly; | 23 | static struct bau_control **uv_bau_table_bases __read_mostly; |
| 24 | static int uv_bau_retry_limit __read_mostly; | 24 | static int uv_bau_retry_limit __read_mostly; |
| 25 | 25 | ||
| 26 | /* position of pnode (which is nasid>>1): */ | ||
| 27 | static int uv_nshift __read_mostly; | ||
| 28 | /* base pnode in this partition */ | 26 | /* base pnode in this partition */ |
| 29 | static int uv_partition_base_pnode __read_mostly; | 27 | static int uv_partition_base_pnode __read_mostly; |
| 30 | 28 | ||
| @@ -723,7 +721,7 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 723 | BUG_ON(!adp); | 721 | BUG_ON(!adp); |
| 724 | 722 | ||
| 725 | pa = uv_gpa(adp); /* need the real nasid*/ | 723 | pa = uv_gpa(adp); /* need the real nasid*/ |
| 726 | n = pa >> uv_nshift; | 724 | n = uv_gpa_to_pnode(pa); |
| 727 | m = pa & uv_mmask; | 725 | m = pa & uv_mmask; |
| 728 | 726 | ||
| 729 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, | 727 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, |
| @@ -778,7 +776,7 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) | |||
| 778 | * need the pnode of where the memory was really allocated | 776 | * need the pnode of where the memory was really allocated |
| 779 | */ | 777 | */ |
| 780 | pa = uv_gpa(pqp); | 778 | pa = uv_gpa(pqp); |
| 781 | pn = pa >> uv_nshift; | 779 | pn = uv_gpa_to_pnode(pa); |
| 782 | uv_write_global_mmr64(pnode, | 780 | uv_write_global_mmr64(pnode, |
| 783 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, | 781 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, |
| 784 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | | 782 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | |
| @@ -843,8 +841,7 @@ static int __init uv_bau_init(void) | |||
| 843 | GFP_KERNEL, cpu_to_node(cur_cpu)); | 841 | GFP_KERNEL, cpu_to_node(cur_cpu)); |
| 844 | 842 | ||
| 845 | uv_bau_retry_limit = 1; | 843 | uv_bau_retry_limit = 1; |
| 846 | uv_nshift = uv_hub_info->n_val; | 844 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; |
| 847 | uv_mmask = (1UL << uv_hub_info->n_val) - 1; | ||
| 848 | nblades = uv_num_possible_blades(); | 845 | nblades = uv_num_possible_blades(); |
| 849 | 846 | ||
| 850 | uv_bau_table_bases = (struct bau_control **) | 847 | uv_bau_table_bases = (struct bau_control **) |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 92929fb3f9fa..3c68fe2d46cf 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -305,6 +305,9 @@ SECTIONS | |||
| 305 | 305 | ||
| 306 | 306 | ||
| 307 | #ifdef CONFIG_X86_32 | 307 | #ifdef CONFIG_X86_32 |
| 308 | /* | ||
| 309 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 310 | */ | ||
| 308 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), | 311 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), |
| 309 | "kernel image bigger than KERNEL_IMAGE_SIZE"); | 312 | "kernel image bigger than KERNEL_IMAGE_SIZE"); |
| 310 | #else | 313 | #else |
