Commit a5b61736 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-fixes-for-linus' of...

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:
  x86: hpet: Work around hardware stupidity
  x86, build: Disable -fPIE when compiling with CONFIG_CC_STACKPROTECTOR=y
  x86, cpufeature: Suppress compiler warning with gcc 3.x
  x86, UV: Fix initialization of max_pnode
parents 03a7ab08 54ff7e59
...@@ -74,7 +74,7 @@ endif ...@@ -74,7 +74,7 @@ endif
ifdef CONFIG_CC_STACKPROTECTOR ifdef CONFIG_CC_STACKPROTECTOR
cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh
ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(biarch)),y) ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y)
stackp-y := -fstack-protector stackp-y := -fstack-protector
KBUILD_CFLAGS += $(stackp-y) KBUILD_CFLAGS += $(stackp-y)
else else
......
...@@ -296,6 +296,7 @@ extern const char * const x86_power_flags[32]; ...@@ -296,6 +296,7 @@ extern const char * const x86_power_flags[32];
#endif /* CONFIG_X86_64 */ #endif /* CONFIG_X86_64 */
#if __GNUC__ >= 4
/* /*
* Static testing of CPU features. Used the same as boot_cpu_has(). * Static testing of CPU features. Used the same as boot_cpu_has().
* These are only valid after alternatives have run, but will statically * These are only valid after alternatives have run, but will statically
...@@ -304,7 +305,7 @@ extern const char * const x86_power_flags[32]; ...@@ -304,7 +305,7 @@ extern const char * const x86_power_flags[32];
*/ */
static __always_inline __pure bool __static_cpu_has(u16 bit) static __always_inline __pure bool __static_cpu_has(u16 bit)
{ {
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) #if __GNUC__ > 4 || __GNUC_MINOR__ >= 5
asm goto("1: jmp %l[t_no]\n" asm goto("1: jmp %l[t_no]\n"
"2:\n" "2:\n"
".section .altinstructions,\"a\"\n" ".section .altinstructions,\"a\"\n"
...@@ -345,7 +346,6 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) ...@@ -345,7 +346,6 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
#endif #endif
} }
#if __GNUC__ >= 4
#define static_cpu_has(bit) \ #define static_cpu_has(bit) \
( \ ( \
__builtin_constant_p(boot_cpu_has(bit)) ? \ __builtin_constant_p(boot_cpu_has(bit)) ? \
......
...@@ -68,7 +68,6 @@ extern unsigned long force_hpet_address; ...@@ -68,7 +68,6 @@ extern unsigned long force_hpet_address;
extern u8 hpet_blockid; extern u8 hpet_blockid;
extern int hpet_force_user; extern int hpet_force_user;
extern u8 hpet_msi_disable; extern u8 hpet_msi_disable;
extern u8 hpet_readback_cmp;
extern int is_hpet_enabled(void); extern int is_hpet_enabled(void);
extern int hpet_enable(void); extern int hpet_enable(void);
extern void hpet_disable(void); extern void hpet_disable(void);
......
...@@ -698,9 +698,11 @@ void __init uv_system_init(void) ...@@ -698,9 +698,11 @@ void __init uv_system_init(void)
for (j = 0; j < 64; j++) { for (j = 0; j < 64; j++) {
if (!test_bit(j, &present)) if (!test_bit(j, &present))
continue; continue;
uv_blade_info[blade].pnode = (i * 64 + j); pnode = (i * 64 + j);
uv_blade_info[blade].pnode = pnode;
uv_blade_info[blade].nr_possible_cpus = 0; uv_blade_info[blade].nr_possible_cpus = 0;
uv_blade_info[blade].nr_online_cpus = 0; uv_blade_info[blade].nr_online_cpus = 0;
max_pnode = max(pnode, max_pnode);
blade++; blade++;
} }
} }
...@@ -738,7 +740,6 @@ void __init uv_system_init(void) ...@@ -738,7 +740,6 @@ void __init uv_system_init(void)
uv_cpu_hub_info(cpu)->scir.offset = uv_scir_offset(apicid); uv_cpu_hub_info(cpu)->scir.offset = uv_scir_offset(apicid);
uv_node_to_blade[nid] = blade; uv_node_to_blade[nid] = blade;
uv_cpu_to_blade[cpu] = blade; uv_cpu_to_blade[cpu] = blade;
max_pnode = max(pnode, max_pnode);
} }
/* Add blade/pnode info for nodes without cpus */ /* Add blade/pnode info for nodes without cpus */
...@@ -750,7 +751,6 @@ void __init uv_system_init(void) ...@@ -750,7 +751,6 @@ void __init uv_system_init(void)
pnode = (paddr >> m_val) & pnode_mask; pnode = (paddr >> m_val) & pnode_mask;
blade = boot_pnode_to_blade(pnode); blade = boot_pnode_to_blade(pnode);
uv_node_to_blade[nid] = blade; uv_node_to_blade[nid] = blade;
max_pnode = max(pnode, max_pnode);
} }
map_gru_high(max_pnode); map_gru_high(max_pnode);
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/gart.h> #include <asm/gart.h>
#include <asm/hpet.h>
static void __init fix_hypertransport_config(int num, int slot, int func) static void __init fix_hypertransport_config(int num, int slot, int func)
{ {
...@@ -192,21 +191,6 @@ static void __init ati_bugs_contd(int num, int slot, int func) ...@@ -192,21 +191,6 @@ static void __init ati_bugs_contd(int num, int slot, int func)
} }
#endif #endif
/*
* Force the read back of the CMP register in hpet_next_event()
* to work around the problem that the CMP register write seems to be
* delayed. See hpet_next_event() for details.
*
* We do this on all SMBUS incarnations for now until we have more
* information about the affected chipsets.
*/
static void __init ati_hpet_bugs(int num, int slot, int func)
{
#ifdef CONFIG_HPET_TIMER
hpet_readback_cmp = 1;
#endif
}
#define QFLAG_APPLY_ONCE 0x1 #define QFLAG_APPLY_ONCE 0x1
#define QFLAG_APPLIED 0x2 #define QFLAG_APPLIED 0x2
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
...@@ -236,8 +220,6 @@ static struct chipset early_qrk[] __initdata = { ...@@ -236,8 +220,6 @@ static struct chipset early_qrk[] __initdata = {
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
{ PCI_VENDOR_ID_ATI, PCI_ANY_ID,
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_hpet_bugs },
{} {}
}; };
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
unsigned long hpet_address; unsigned long hpet_address;
u8 hpet_blockid; /* OS timer block num */ u8 hpet_blockid; /* OS timer block num */
u8 hpet_msi_disable; u8 hpet_msi_disable;
u8 hpet_readback_cmp;
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
static unsigned long hpet_num_timers; static unsigned long hpet_num_timers;
...@@ -395,21 +394,25 @@ static int hpet_next_event(unsigned long delta, ...@@ -395,21 +394,25 @@ static int hpet_next_event(unsigned long delta,
* at that point and we would wait for the next hpet interrupt * at that point and we would wait for the next hpet interrupt
* forever. We found out that reading the CMP register back * forever. We found out that reading the CMP register back
* forces the transfer so we can rely on the comparison with * forces the transfer so we can rely on the comparison with
* the counter register below. * the counter register below. If the read back from the
* compare register does not match the value we programmed
* then we might have a real hardware problem. We can not do
* much about it here, but at least alert the user/admin with
* a prominent warning.
* *
* That works fine on those ATI chipsets, but on newer Intel * An erratum on some chipsets (ICH9,..), results in
* chipsets (ICH9...) this triggers due to an erratum: Reading * comparator read immediately following a write returning old
* the comparator immediately following a write is returning * value. Workaround for this is to read this value second
* the old value. * time, when first read returns old value.
* *
* We restrict the read back to the affected ATI chipsets (set * In fact the write to the comparator register is delayed up
* by quirks) and also run it with hpet=verbose for debugging * to two HPET cycles so the workaround we tried to restrict
* purposes. * the readback to those known to be borked ATI chipsets
* failed miserably. So we give up on optimizations forever
* and penalize all HPET incarnations unconditionally.
*/ */
if (hpet_readback_cmp || hpet_verbose) { if (unlikely((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt)) {
u32 cmp = hpet_readl(HPET_Tn_CMP(timer)); if (hpet_readl(HPET_Tn_CMP(timer)) != cnt)
if (cmp != cnt)
printk_once(KERN_WARNING printk_once(KERN_WARNING
"hpet: compare register read back failed.\n"); "hpet: compare register read back failed.\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment