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
This commit is contained in:
commit
a5b617368c
|
@ -74,7 +74,7 @@ endif
|
|||
|
||||
ifdef CONFIG_CC_STACKPROTECTOR
|
||||
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
|
||||
KBUILD_CFLAGS += $(stackp-y)
|
||||
else
|
||||
|
|
|
@ -296,6 +296,7 @@ extern const char * const x86_power_flags[32];
|
|||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
#if __GNUC__ >= 4
|
||||
/*
|
||||
* Static testing of CPU features. Used the same as boot_cpu_has().
|
||||
* These are only valid after alternatives have run, but will statically
|
||||
|
@ -304,7 +305,7 @@ extern const char * const x86_power_flags[32];
|
|||
*/
|
||||
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"
|
||||
"2:\n"
|
||||
".section .altinstructions,\"a\"\n"
|
||||
|
@ -345,7 +346,6 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if __GNUC__ >= 4
|
||||
#define static_cpu_has(bit) \
|
||||
( \
|
||||
__builtin_constant_p(boot_cpu_has(bit)) ? \
|
||||
|
|
|
@ -68,7 +68,6 @@ extern unsigned long force_hpet_address;
|
|||
extern u8 hpet_blockid;
|
||||
extern int hpet_force_user;
|
||||
extern u8 hpet_msi_disable;
|
||||
extern u8 hpet_readback_cmp;
|
||||
extern int is_hpet_enabled(void);
|
||||
extern int hpet_enable(void);
|
||||
extern void hpet_disable(void);
|
||||
|
|
|
@ -698,9 +698,11 @@ void __init uv_system_init(void)
|
|||
for (j = 0; j < 64; j++) {
|
||||
if (!test_bit(j, &present))
|
||||
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_online_cpus = 0;
|
||||
max_pnode = max(pnode, max_pnode);
|
||||
blade++;
|
||||
}
|
||||
}
|
||||
|
@ -738,7 +740,6 @@ void __init uv_system_init(void)
|
|||
uv_cpu_hub_info(cpu)->scir.offset = uv_scir_offset(apicid);
|
||||
uv_node_to_blade[nid] = blade;
|
||||
uv_cpu_to_blade[cpu] = blade;
|
||||
max_pnode = max(pnode, max_pnode);
|
||||
}
|
||||
|
||||
/* Add blade/pnode info for nodes without cpus */
|
||||
|
@ -750,7 +751,6 @@ void __init uv_system_init(void)
|
|||
pnode = (paddr >> m_val) & pnode_mask;
|
||||
blade = boot_pnode_to_blade(pnode);
|
||||
uv_node_to_blade[nid] = blade;
|
||||
max_pnode = max(pnode, max_pnode);
|
||||
}
|
||||
|
||||
map_gru_high(max_pnode);
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <asm/apic.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/gart.h>
|
||||
#include <asm/hpet.h>
|
||||
|
||||
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)
|
|||
}
|
||||
#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_APPLIED 0x2
|
||||
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
|
||||
|
@ -236,8 +220,6 @@ static struct chipset early_qrk[] __initdata = {
|
|||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
|
||||
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
||||
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 @@
|
|||
unsigned long hpet_address;
|
||||
u8 hpet_blockid; /* OS timer block num */
|
||||
u8 hpet_msi_disable;
|
||||
u8 hpet_readback_cmp;
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
static unsigned long hpet_num_timers;
|
||||
|
@ -395,23 +394,27 @@ static int hpet_next_event(unsigned long delta,
|
|||
* at that point and we would wait for the next hpet interrupt
|
||||
* forever. We found out that reading the CMP register back
|
||||
* 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
|
||||
* chipsets (ICH9...) this triggers due to an erratum: Reading
|
||||
* the comparator immediately following a write is returning
|
||||
* the old value.
|
||||
* An erratum on some chipsets (ICH9,..), results in
|
||||
* comparator read immediately following a write returning old
|
||||
* value. Workaround for this is to read this value second
|
||||
* time, when first read returns old value.
|
||||
*
|
||||
* We restrict the read back to the affected ATI chipsets (set
|
||||
* by quirks) and also run it with hpet=verbose for debugging
|
||||
* purposes.
|
||||
* In fact the write to the comparator register is delayed up
|
||||
* to two HPET cycles so the workaround we tried to restrict
|
||||
* 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) {
|
||||
u32 cmp = hpet_readl(HPET_Tn_CMP(timer));
|
||||
|
||||
if (cmp != cnt)
|
||||
if (unlikely((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt)) {
|
||||
if (hpet_readl(HPET_Tn_CMP(timer)) != cnt)
|
||||
printk_once(KERN_WARNING
|
||||
"hpet: compare register read back failed.\n");
|
||||
"hpet: compare register read back failed.\n");
|
||||
}
|
||||
|
||||
return (s32)(hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
|
||||
|
|
Loading…
Reference in New Issue