x86 fixes
Subsystems (2)
Linus,
Please pull the latest x86-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git x86-fixes-for-linus
Most of the diffstat is due to the two UV fixes, which do not affect other machines.
Thanks,
Ingo
------------------>
Borislav Petkov (2):
Revert "x86, AMD: Fix APIC timer erratum 400 affecting K8 Rev.A-E processors" x86, AMD: Fix ARAT feature setting again
Cliff Wickman (1):
x86: Fix UV BAU for non-consecutive nasids
Jack Steiner (1):
x86, UV: Fix NMI handler for UV platforms
Julia Lawall (1):
x86, mce, AMD: Fix leaving freed data in a list
Youquan Song (1):
x86, apic: Fix spurious error interrupts triggering on all non-boot APs
arch/x86/include/asm/apicdef.h | 1 + arch/x86/include/asm/uv/uv_bau.h | 17 ++++- arch/x86/include/asm/uv/uv_hub.h | 2 + arch/x86/include/asm/uv/uv_mmrs.h | 16 +++++- arch/x86/kernel/apic/x2apic_uv_x.c | 48 ++++++++++++++-- arch/x86/kernel/cpu/amd.c | 4 +- arch/x86/kernel/cpu/mcheck/mce_amd.c | 1 + arch/x86/kernel/cpu/mcheck/therm_throt.c | 12 ++-- arch/x86/platform/uv/tlb_uv.c | 92 ++++++++++++++++++++--------- 9 files changed, 147 insertions(+), 46 deletions(-)
arch/x86/include/asm/apicdef.h +1 -0
@@ -78,6 +78,7 @@#define APIC_DEST_LOGICAL 0x00800#define APIC_DEST_PHYSICAL 0x00000#define APIC_DM_FIXED 0x00000 +#define APIC_DM_FIXED_MASK 0x00700#define APIC_DM_LOWEST 0x00100#define APIC_DM_SMI 0x00200#define APIC_DM_REMRD 0x00300
arch/x86/include/asm/uv/uv_bau.h +13 -4
@@ -94,6 +94,8 @@/* after this # consecutive successes, bump up the throttle if it was lowered */ #define COMPLETE_THRESHOLD 5 +#define UV_LB_SUBNODEID 0x10 +/* * number of entries in the destination side payload queue */
@@ -124,7 +126,7 @@* The distribution specification (32 bytes) is interpreted as a 256-bit * distribution vector. Adjacent bits correspond to consecutive even numbered * nodeIDs. The result of adding the index of a given bit to the 15-bit -* 'base_dest_nodeid' field of the header corresponds to the +* 'base_dest_nasid' field of the header corresponds to the * destination nodeID associated with that specified bit. */ struct bau_target_uvhubmask {
@@ -176,7 +178,7 @@ struct bau_msg_payload {struct bau_msg_header {unsigned int dest_subnodeid:6 ;/* must be 0x10, for the LB */ /* bits 5:0 */ -unsigned int base_dest_nodeid:15 ;/* nasid of the */ +unsigned int base_dest_nasid:15 ;/* nasid of the */ /* bits 20:6 */ /* first bit in uvhub map */ unsigned int command:8 ;/* message type */ /* bits 28:21 */
@@ -378,6 +380,10 @@ struct ptc_stats {unsigned long d_rcanceled;/* number of messages canceled by resets */ }; +struct hub_and_pnode { +short uvhub; +short pnode; +};/* * one per-cpu; to locate the software tables */
@@ -399,10 +405,12 @@ struct bau_control {int baudisabled;int set_bau_off;short cpu; +short osnode;short uvhub_cpu;short uvhub;short cpus_in_socket;short cpus_in_uvhub; +short partition_base_pnode;unsigned short message_number;unsigned short uvhub_quiesce;short socket_acknowledge_count[DEST_Q_SIZE ];
@@ -422,15 +430,16 @@ struct bau_control {int congested_period;cycles_t period_time;long period_requests; +struct hub_and_pnode *target_hub_and_pnode; };static inline int bau_uvhub_isset (int uvhub,struct bau_target_uvhubmask *dstp) {return constant_test_bit (uvhub, &dstp->bits[0 ]); } -static inline void bau_uvhub_set (int uvhub,struct bau_target_uvhubmask *dstp) +static inline void bau_uvhub_set (int pnode,struct bau_target_uvhubmask *dstp) { -__set_bit (uvhub, &dstp->bits[0 ]); +__set_bit (pnode, &dstp->bits[0 ]); }static inline void bau_uvhubs_clear (struct bau_target_uvhubmask *dstp,int nbits)
arch/x86/include/asm/uv/uv_hub.h +2 -0
@@ -398,6 +398,8 @@ struct uv_blade_info {unsigned short nr_online_cpus;unsigned short pnode;short memory_nid; +spinlock_t nmi_lock; +unsigned long nmi_count; };extern struct uv_blade_info *uv_blade_info;extern short *uv_node_to_blade;
arch/x86/include/asm/uv/uv_mmrs.h +15 -1
@@ -5,7 +5,7 @@* * SGI UV MMR definitions * -* Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. +* Copyright (C) 2007-2011 Silicon Graphics, Inc. All rights reserved. */ #ifndef _ASM_X86_UV_UV_MMRS_H
@@ -1099,5 +1099,19 @@ union uvh_rtc1_int_config_u { } s; }; +/* ========================================================================= */ +/* UVH_SCRATCH5 */ +/* ========================================================================= */ +#define UVH_SCRATCH5 0x2d0200UL +#define UVH_SCRATCH5_32 0x00778 + +#define UVH_SCRATCH5_SCRATCH5_SHFT 0 +#define UVH_SCRATCH5_SCRATCH5_MASK 0xffffffffffffffffUL +union uvh_scratch5_u { +unsigned long v; +struct uvh_scratch5_s { +unsigned long scratch5 :64 ;/* RW, W1CS */ + } s; +};#endif /* __ASM_UV_MMRS_X86_H__ */
arch/x86/kernel/apic/x2apic_uv_x.c +43 -5
88 lines not on this page · raw message
arch/x86/kernel/cpu/amd.c +2 -2
@@ -613,7 +613,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)#endif /* As a rule processors have APIC timer running in deep C states */ -if (c->x86 >=0xf && !cpu_has_amd_erratum (amd_erratum_400)) +if (c->x86 >0xf && !cpu_has_amd_erratum (amd_erratum_400))set_cpu_cap (c,X86_FEATURE_ARAT );/*
@@ -698,7 +698,7 @@ cpu_dev_register(amd_cpu_dev);*/ const int amd_erratum_400[] = -AMD_OSVW_ERRATUM (1 ,AMD_MODEL_RANGE (0x0f ,0x4 ,0x2 ,0xff ,0xf ), +AMD_OSVW_ERRATUM (1 ,AMD_MODEL_RANGE (0xf ,0x41 ,0x2 ,0xff ,0xf ),AMD_MODEL_RANGE (0x10 ,0x2 ,0x1 ,0xff ,0xf ));EXPORT_SYMBOL_GPL (amd_erratum_400);
arch/x86/kernel/cpu/mcheck/mce_amd.c +1 -0
@@ -509,6 +509,7 @@ recurse: out_free:if (b) {kobject_put (&b->kobj); +list_del (&b->miscj);kfree (b); }return err;
arch/x86/kernel/cpu/mcheck/therm_throt.c +7 -5
@@ -446,18 +446,20 @@ void intel_init_thermal(struct cpuinfo_x86 *c)*/ rdmsr (MSR_IA32_MISC_ENABLE , l, h); + h = lvtthmr_init;/* * The initial value of thermal LVT entries on all APs always reads * 0x10000 because APs are woken up by BSP issuing INIT-SIPI-SIPI * sequence to them and LVT registers are reset to 0s except for * the mask bits which are set to 1s when APs receive INIT IPI. -* Always restore the value that BIOS has programmed on AP based on -* BSP's info we saved since BIOS is always setting the same value -* for all threads/cores +* If BIOS takes over the thermal interrupt and sets its interrupt +* delivery mode to SMI (not fixed), it restores the value that the +* BIOS has programmed on AP based on BSP's info we saved since BIOS +* is always setting the same value for all threads/cores. */ -apic_write (APIC_LVTTHMR , lvtthmr_init); +if ((h &APIC_DM_FIXED_MASK ) !=APIC_DM_FIXED ) +apic_write (APIC_LVTTHMR , lvtthmr_init); - h = lvtthmr_init;if ((l &MSR_IA32_MISC_ENABLE_TM1 ) && (h &APIC_DM_SMI )) { printk(KERN_DEBUG
arch/x86/platform/uv/tlb_uv.c +63 -29
198 lines not on this page · raw message