Commit 212f3000 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-idle-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 idle updates from Ingo Molnar:
 "There were two bigger changes in this development cycle:

   - remove idle notifiers:

       32 files changed, 74 insertions(+), 803 deletions(-)

     These notifiers were of questionable value and the main usecase,
     the i7300 driver, was essentially unmaintained and can be removed,
     plus modern power management concepts don't need the callback - so
     use this golden opportunity and get rid of this opaque and fragile
     callback from a latency sensitive code path.

     (Len Brown, Thomas Gleixner)

   - improve the AMD Erratum 400 workaround that used high overhead MSR
     polling in the idle loop (Borisla Petkov, Thomas Gleixner)"

* 'x86-idle-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86: Remove empty idle.h header
  x86/amd: Simplify AMD E400 aware idle routine
  x86/amd: Check for the C1E bug post ACPI subsystem init
  x86/bugs: Separate AMD E400 erratum and C1E bug
  x86/cpufeature: Provide helper to set bugs bits
  x86/idle: Remove enter_idle(), exit_idle()
  x86: Remove x86_test_and_clear_bit_percpu()
  x86/idle: Remove is_idle flag
  x86/idle: Remove idle_notifier
  i7300_idle: Remove this driver
parents 6f3be0f0 34bc3560
...@@ -6104,12 +6104,6 @@ S: Maintained ...@@ -6104,12 +6104,6 @@ S: Maintained
F: Documentation/cdrom/ide-cd F: Documentation/cdrom/ide-cd
F: drivers/ide/ide-cd* F: drivers/ide/ide-cd*
IDLE-I7300
M: Andy Henroid <andrew.d.henroid@intel.com>
L: linux-pm@vger.kernel.org
S: Supported
F: drivers/idle/i7300_idle.c
IEEE 802.15.4 SUBSYSTEM IEEE 802.15.4 SUBSYSTEM
M: Alexander Aring <aar@pengutronix.de> M: Alexander Aring <aar@pengutronix.de>
M: Stefan Schmidt <stefan@osg.samsung.com> M: Stefan Schmidt <stefan@osg.samsung.com>
......
...@@ -94,7 +94,7 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate) ...@@ -94,7 +94,7 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate)
boot_cpu_data.x86_model <= 0x05 && boot_cpu_data.x86_model <= 0x05 &&
boot_cpu_data.x86_mask < 0x0A) boot_cpu_data.x86_mask < 0x0A)
return 1; return 1;
else if (amd_e400_c1e_detected) else if (boot_cpu_has(X86_BUG_AMD_APIC_C1E))
return 1; return 1;
else else
return max_cstate; return max_cstate;
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include <asm/fixmap.h> #include <asm/fixmap.h>
#include <asm/mpspec.h> #include <asm/mpspec.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/idle.h>
#define ARCH_APICTIMER_STOPS_ON_C3 1 #define ARCH_APICTIMER_STOPS_ON_C3 1
...@@ -640,7 +639,6 @@ extern void irq_exit(void); ...@@ -640,7 +639,6 @@ extern void irq_exit(void);
static inline void entering_irq(void) static inline void entering_irq(void)
{ {
irq_enter(); irq_enter();
exit_idle();
} }
static inline void entering_ack_irq(void) static inline void entering_ack_irq(void)
......
...@@ -204,6 +204,7 @@ static __always_inline __pure bool _static_cpu_has(u16 bit) ...@@ -204,6 +204,7 @@ static __always_inline __pure bool _static_cpu_has(u16 bit)
#define static_cpu_has_bug(bit) static_cpu_has((bit)) #define static_cpu_has_bug(bit) static_cpu_has((bit))
#define boot_cpu_has_bug(bit) cpu_has_bug(&boot_cpu_data, (bit)) #define boot_cpu_has_bug(bit) cpu_has_bug(&boot_cpu_data, (bit))
#define boot_cpu_set_bug(bit) set_cpu_cap(&boot_cpu_data, (bit))
#define MAX_CPU_FEATURES (NCAPINTS * 32) #define MAX_CPU_FEATURES (NCAPINTS * 32)
#define cpu_have_feature boot_cpu_has #define cpu_have_feature boot_cpu_has
......
...@@ -314,4 +314,6 @@ ...@@ -314,4 +314,6 @@
#define X86_BUG_NULL_SEG X86_BUG(10) /* Nulling a selector preserves the base */ #define X86_BUG_NULL_SEG X86_BUG(10) /* Nulling a selector preserves the base */
#define X86_BUG_SWAPGS_FENCE X86_BUG(11) /* SWAPGS without input dep on GS */ #define X86_BUG_SWAPGS_FENCE X86_BUG(11) /* SWAPGS without input dep on GS */
#define X86_BUG_MONITOR X86_BUG(12) /* IPI required to wake up remote CPU */ #define X86_BUG_MONITOR X86_BUG(12) /* IPI required to wake up remote CPU */
#define X86_BUG_AMD_E400 X86_BUG(13) /* CPU is among the affected by Erratum 400 */
#endif /* _ASM_X86_CPUFEATURES_H */ #endif /* _ASM_X86_CPUFEATURES_H */
#ifndef _ASM_X86_IDLE_H
#define _ASM_X86_IDLE_H
#define IDLE_START 1
#define IDLE_END 2
struct notifier_block;
void idle_notifier_register(struct notifier_block *n);
void idle_notifier_unregister(struct notifier_block *n);
#ifdef CONFIG_X86_64
void enter_idle(void);
void exit_idle(void);
#else /* !CONFIG_X86_64 */
static inline void enter_idle(void) { }
static inline void exit_idle(void) { }
static inline void __exit_idle(void) { }
#endif /* CONFIG_X86_64 */
void amd_e400_remove_cpu(int cpu);
#endif /* _ASM_X86_IDLE_H */
...@@ -507,17 +507,6 @@ do { \ ...@@ -507,17 +507,6 @@ do { \
#endif #endif
/* This is not atomic against other CPUs -- CPU preemption needs to be off */
#define x86_test_and_clear_bit_percpu(bit, var) \
({ \
bool old__; \
asm volatile("btr %2,"__percpu_arg(1)"\n\t" \
CC_SET(c) \
: CC_OUT(c) (old__), "+m" (var) \
: "dIr" (bit)); \
old__; \
})
static __always_inline bool x86_this_cpu_constant_test_bit(unsigned int nr, static __always_inline bool x86_this_cpu_constant_test_bit(unsigned int nr,
const unsigned long __percpu *addr) const unsigned long __percpu *addr)
{ {
......
...@@ -633,10 +633,9 @@ static inline void sync_core(void) ...@@ -633,10 +633,9 @@ static inline void sync_core(void)
} }
extern void select_idle_routine(const struct cpuinfo_x86 *c); extern void select_idle_routine(const struct cpuinfo_x86 *c);
extern void init_amd_e400_c1e_mask(void); extern void amd_e400_c1e_apic_setup(void);
extern unsigned long boot_option_idle_override; extern unsigned long boot_option_idle_override;
extern bool amd_e400_c1e_detected;
enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT, enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_NOMWAIT,
IDLE_POLL}; IDLE_POLL};
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/hpet.h> #include <asm/hpet.h>
#include <asm/idle.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/smp.h> #include <asm/smp.h>
...@@ -894,11 +893,13 @@ void __init setup_boot_APIC_clock(void) ...@@ -894,11 +893,13 @@ void __init setup_boot_APIC_clock(void)
/* Setup the lapic or request the broadcast */ /* Setup the lapic or request the broadcast */
setup_APIC_timer(); setup_APIC_timer();
amd_e400_c1e_apic_setup();
} }
void setup_secondary_APIC_clock(void) void setup_secondary_APIC_clock(void)
{ {
setup_APIC_timer(); setup_APIC_timer();
amd_e400_c1e_apic_setup();
} }
/* /*
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <asm/irqdomain.h> #include <asm/irqdomain.h>
#include <asm/idle.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/cpu.h> #include <asm/cpu.h>
......
...@@ -20,6 +20,10 @@ ...@@ -20,6 +20,10 @@
#include "cpu.h" #include "cpu.h"
static const int amd_erratum_383[];
static const int amd_erratum_400[];
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum);
/* /*
* nodes_per_socket: Stores the number of nodes per socket. * nodes_per_socket: Stores the number of nodes per socket.
* Refer to Fam15h Models 00-0fh BKDG - CPUID Fn8000_001E_ECX * Refer to Fam15h Models 00-0fh BKDG - CPUID Fn8000_001E_ECX
...@@ -592,11 +596,16 @@ static void early_init_amd(struct cpuinfo_x86 *c) ...@@ -592,11 +596,16 @@ static void early_init_amd(struct cpuinfo_x86 *c)
/* F16h erratum 793, CVE-2013-6885 */ /* F16h erratum 793, CVE-2013-6885 */
if (c->x86 == 0x16 && c->x86_model <= 0xf) if (c->x86 == 0x16 && c->x86_model <= 0xf)
msr_set_bit(MSR_AMD64_LS_CFG, 15); msr_set_bit(MSR_AMD64_LS_CFG, 15);
}
static const int amd_erratum_383[]; /*
static const int amd_erratum_400[]; * Check whether the machine is affected by erratum 400. This is
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum); * used to select the proper idle routine and to enable the check
* whether the machine is affected in arch_post_acpi_init(), which
* sets the X86_BUG_AMD_APIC_C1E bug depending on the MSR check.
*/
if (cpu_has_amd_erratum(c, amd_erratum_400))
set_cpu_bug(c, X86_BUG_AMD_E400);
}
static void init_amd_k8(struct cpuinfo_x86 *c) static void init_amd_k8(struct cpuinfo_x86 *c)
{ {
...@@ -777,9 +786,6 @@ static void init_amd(struct cpuinfo_x86 *c) ...@@ -777,9 +786,6 @@ static void init_amd(struct cpuinfo_x86 *c)
if (c->x86 > 0x11) if (c->x86 > 0x11)
set_cpu_cap(c, X86_FEATURE_ARAT); set_cpu_cap(c, X86_FEATURE_ARAT);
if (cpu_has_amd_erratum(c, amd_erratum_400))
set_cpu_bug(c, X86_BUG_AMD_APIC_C1E);
rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy); rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
/* 3DNow or LM implies PREFETCHW */ /* 3DNow or LM implies PREFETCHW */
......
...@@ -1172,7 +1172,6 @@ void enable_sep_cpu(void) ...@@ -1172,7 +1172,6 @@ void enable_sep_cpu(void)
void __init identify_boot_cpu(void) void __init identify_boot_cpu(void)
{ {
identify_cpu(&boot_cpu_data); identify_cpu(&boot_cpu_data);
init_amd_e400_c1e_mask();
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
sysenter_setup(); sysenter_setup();
enable_sep_cpu(); enable_sep_cpu();
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include <asm/amd_nb.h> #include <asm/amd_nb.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/idle.h>
#include <asm/mce.h> #include <asm/mce.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/trace/irq_vectors.h> #include <asm/trace/irq_vectors.h>
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/idle.h>
#include <asm/mce.h> #include <asm/mce.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/trace/irq_vectors.h> #include <asm/trace/irq_vectors.h>
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <asm/irq_vectors.h> #include <asm/irq_vectors.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/idle.h>
#include <asm/mce.h> #include <asm/mce.h>
#include <asm/trace/irq_vectors.h> #include <asm/trace/irq_vectors.h>
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <asm/hyperv.h> #include <asm/hyperv.h>
#include <asm/mshyperv.h> #include <asm/mshyperv.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/idle.h>
#include <asm/irq_regs.h> #include <asm/irq_regs.h>
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/apic.h> #include <asm/apic.h>
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/idle.h>
#include <asm/mce.h> #include <asm/mce.h>
#include <asm/hw_irq.h> #include <asm/hw_irq.h>
#include <asm/desc.h> #include <asm/desc.h>
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/idle.h>
#include <asm/apic.h> #include <asm/apic.h>
int sysctl_panic_on_stackoverflow; int sysctl_panic_on_stackoverflow;
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/idle.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/apicdef.h> #include <asm/apicdef.h>
#include <asm/hypervisor.h> #include <asm/hypervisor.h>
...@@ -267,13 +266,11 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code) ...@@ -267,13 +266,11 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code)
case KVM_PV_REASON_PAGE_NOT_PRESENT: case KVM_PV_REASON_PAGE_NOT_PRESENT:
/* page is swapped out by the host. */ /* page is swapped out by the host. */
prev_state = exception_enter(); prev_state = exception_enter();
exit_idle();
kvm_async_pf_task_wait((u32)read_cr2()); kvm_async_pf_task_wait((u32)read_cr2());
exception_exit(prev_state); exception_exit(prev_state);
break; break;
case KVM_PV_REASON_PAGE_READY: case KVM_PV_REASON_PAGE_READY:
rcu_irq_enter(); rcu_irq_enter();
exit_idle();
kvm_async_pf_task_wake((u32)read_cr2()); kvm_async_pf_task_wake((u32)read_cr2());
rcu_irq_exit(); rcu_irq_exit();
break; break;
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
#include <asm/idle.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/mwait.h> #include <asm/mwait.h>
#include <asm/fpu/internal.h> #include <asm/fpu/internal.h>
...@@ -65,23 +64,6 @@ __visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss) = { ...@@ -65,23 +64,6 @@ __visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, cpu_tss) = {
}; };
EXPORT_PER_CPU_SYMBOL(cpu_tss); EXPORT_PER_CPU_SYMBOL(cpu_tss);
#ifdef CONFIG_X86_64
static DEFINE_PER_CPU(unsigned char, is_idle);
static ATOMIC_NOTIFIER_HEAD(idle_notifier);
void idle_notifier_register(struct notifier_block *n)
{
atomic_notifier_chain_register(&idle_notifier, n);
}
EXPORT_SYMBOL_GPL(idle_notifier_register);
void idle_notifier_unregister(struct notifier_block *n)
{
atomic_notifier_chain_unregister(&idle_notifier, n);
}
EXPORT_SYMBOL_GPL(idle_notifier_unregister);
#endif
/* /*
* this gets called so that we can store lazy state into memory and copy the * this gets called so that we can store lazy state into memory and copy the
* current task into the new thread. * current task into the new thread.
...@@ -251,39 +233,9 @@ static inline void play_dead(void) ...@@ -251,39 +233,9 @@ static inline void play_dead(void)
} }
#endif #endif
#ifdef CONFIG_X86_64
void enter_idle(void)
{
this_cpu_write(is_idle, 1);
atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
}
static void __exit_idle(void)
{
if (x86_test_and_clear_bit_percpu(0, is_idle) == 0)
return;
atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
}
/* Called from interrupts to signify idle end */
void exit_idle(void)
{
/* idle loop has pid 0 */
if (current->pid)
return;
__exit_idle();
}
#endif
void arch_cpu_idle_enter(void) void arch_cpu_idle_enter(void)
{ {
local_touch_nmi(); local_touch_nmi();
enter_idle();
}
void arch_cpu_idle_exit(void)
{
__exit_idle();
} }
void arch_cpu_idle_dead(void) void arch_cpu_idle_dead(void)
...@@ -336,59 +288,33 @@ void stop_this_cpu(void *dummy) ...@@ -336,59 +288,33 @@ void stop_this_cpu(void *dummy)
halt(); halt();
} }
bool amd_e400_c1e_detected;
EXPORT_SYMBOL(amd_e400_c1e_detected);
static cpumask_var_t amd_e400_c1e_mask;
void amd_e400_remove_cpu(int cpu)
{
if (amd_e400_c1e_mask != NULL)
cpumask_clear_cpu(cpu, amd_e400_c1e_mask);
}
/* /*
* AMD Erratum 400 aware idle routine. We check for C1E active in the interrupt * AMD Erratum 400 aware idle routine. We handle it the same way as C3 power
* pending message MSR. If we detect C1E, then we handle it the same * states (local apic timer and TSC stop).
* way as C3 power states (local apic timer and TSC stop)
*/ */
static void amd_e400_idle(void) static void amd_e400_idle(void)
{ {
if (!amd_e400_c1e_detected) { /*
u32 lo, hi; * We cannot use static_cpu_has_bug() here because X86_BUG_AMD_APIC_C1E
* gets set after static_cpu_has() places have been converted via
rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi); * alternatives.
*/
if (lo & K8_INTP_C1E_ACTIVE_MASK) { if (!boot_cpu_has_bug(X86_BUG_AMD_APIC_C1E)) {
amd_e400_c1e_detected = true; default_idle();
if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) return;
mark_tsc_unstable("TSC halt in AMD C1E");
pr_info("System has AMD C1E enabled\n");
}
} }
if (amd_e400_c1e_detected) { tick_broadcast_enter();
int cpu = smp_processor_id();
if (!cpumask_test_cpu(cpu, amd_e400_c1e_mask)) { default_idle();
cpumask_set_cpu(cpu, amd_e400_c1e_mask);
/* Force broadcast so ACPI can not interfere. */
tick_broadcast_force();
pr_info("Switch to broadcast mode on CPU%d\n", cpu);
}
tick_broadcast_enter();
default_idle();
/* /*
* The switch back from broadcast mode needs to be * The switch back from broadcast mode needs to be called with
* called with interrupts disabled. * interrupts disabled.
*/ */
local_irq_disable(); local_irq_disable();
tick_broadcast_exit(); tick_broadcast_exit();
local_irq_enable(); local_irq_enable();
} else
default_idle();
} }
/* /*
...@@ -448,8 +374,7 @@ void select_idle_routine(const struct cpuinfo_x86 *c) ...@@ -448,8 +374,7 @@ void select_idle_routine(const struct cpuinfo_x86 *c)
if (x86_idle || boot_option_idle_override == IDLE_POLL) if (x86_idle || boot_option_idle_override == IDLE_POLL)
return; return;
if (cpu_has_bug(c, X86_BUG_AMD_APIC_C1E)) { if (boot_cpu_has_bug(X86_BUG_AMD_E400)) {
/* E400: APIC timer interrupt does not wake up CPU from C1e */
pr_info("using AMD E400 aware idle routine\n"); pr_info("using AMD E400 aware idle routine\n");
x86_idle = amd_e400_idle; x86_idle = amd_e400_idle;
} else if (prefer_mwait_c1_over_halt(c)) { } else if (prefer_mwait_c1_over_halt(c)) {
...@@ -459,11 +384,37 @@ void select_idle_routine(const struct cpuinfo_x86 *c) ...@@ -459,11 +384,37 @@ void select_idle_routine(const struct cpuinfo_x86 *c)
x86_idle = default_idle; x86_idle = default_idle;
} }
void __init init_amd_e400_c1e_mask(void) void amd_e400_c1e_apic_setup(void)
{
if (boot_cpu_has_bug(X86_BUG_AMD_APIC_C1E)) {
pr_info("Switch to broadcast mode on CPU%d\n", smp_processor_id());
local_irq_disable();
tick_broadcast_force();
local_irq_enable();
}
}
void __init arch_post_acpi_subsys_init(void)
{ {
/* If we're using amd_e400_idle, we need to allocate amd_e400_c1e_mask. */ u32 lo, hi;
if (x86_idle == amd_e400_idle)
zalloc_cpumask_var(&amd_e400_c1e_mask, GFP_KERNEL); if (!boot_cpu_has_bug(X86_BUG_AMD_E400))
return;
/*
* AMD E400 detection needs to happen after ACPI has been enabled. If
* the machine is affected K8_INTP_C1E_ACTIVE_MASK bits are set in
* MSR_K8_INT_PENDING_MSG.
*/
rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi);
if (!(lo & K8_INTP_C1E_ACTIVE_MASK))
return;
boot_cpu_set_bug(X86_BUG_AMD_APIC_C1E);
if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
mark_tsc_unstable("TSC halt in AMD C1E");
pr_info("System has AMD C1E enabled\n");
} }
static int __init idle_setup(char *str) static int __init idle_setup(char *str)
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/idle.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
#include <asm/debugreg.h> #include <asm/debugreg.h>
#include <asm/switch_to.h> #include <asm/switch_to.h>
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/ia32.h> #include <asm/ia32.h>
#include <asm/idle.h>
#include <asm/syscalls.h> #include <asm/syscalls.h>
#include <asm/debugreg.h> #include <asm/debugreg.h>
#include <asm/switch_to.h> #include <asm/switch_to.h>
......
...@@ -58,7 +58,6 @@ ...@@ -58,7 +58,6 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/idle.h>
#include <asm/realmode.h> #include <asm/realmode.h>
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/numa.h> #include <asm/numa.h>
...@@ -1596,7 +1595,6 @@ void play_dead_common(void) ...@@ -1596,7 +1595,6 @@ void play_dead_common(void)
{ {
idle_task_exit(); idle_task_exit();
reset_lazy_tlbstate(); reset_lazy_tlbstate();
amd_e400_remove_cpu(raw_smp_processor_id());
/* Ack it */ /* Ack it */
(void)cpu_report_death(); (void)cpu_report_death();
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <asm/uv/uv_hub.h> #include <asm/uv/uv_hub.h>
#include <asm/uv/uv_bau.h> #include <asm/uv/uv_bau.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/idle.h>
#include <asm/tsc.h> #include <asm/tsc.h>
#include <asm/irq_vectors.h> #include <asm/irq_vectors.h>
#include <asm/timer.h> #include <asm/timer.h>
......
...@@ -141,7 +141,7 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr, ...@@ -141,7 +141,7 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr,
if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT)) if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT))
return; return;
if (amd_e400_c1e_detected) if (boot_cpu_has_bug(X86_BUG_AMD_APIC_C1E))
type = ACPI_STATE_C1; type = ACPI_STATE_C1;
/* /*
......
...@@ -106,8 +106,6 @@ ...@@ -106,8 +106,6 @@
#define IOAT_DMA_COMP_V1 0x0001 /* Compatibility with DMA version 1 */ #define IOAT_DMA_COMP_V1 0x0001 /* Compatibility with DMA version 1 */
#define IOAT_DMA_COMP_V2 0x0002 /* Compatibility with DMA version 2 */ #define IOAT_DMA_COMP_V2 0x0002 /* Compatibility with DMA version 2 */
/* IOAT1 define left for i7300_idle driver to not fail compiling */
#define IOAT1_CHANSTS_OFFSET 0x04
#define IOAT_CHANSTS_OFFSET 0x08 /* 64-bit Channel Status Register */ #define IOAT_CHANSTS_OFFSET 0x08 /* 64-bit Channel Status Register */
#define IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR (~0x3fULL) #define IOAT_CHANSTS_COMPLETED_DESCRIPTOR_ADDR (~0x3fULL)
#define IOAT_CHANSTS_SOFT_ERR 0x10ULL #define IOAT_CHANSTS_SOFT_ERR 0x10ULL
......
...@@ -8,20 +8,3 @@ config INTEL_IDLE ...@@ -8,20 +8,3 @@ config INTEL_IDLE
native Intel hardware idle features. The acpi_idle driver native Intel hardware idle features. The acpi_idle driver
can be configured at the same time, in order to handle can be configured at the same time, in order to handle
processors intel_idle does not support. processors intel_idle does not support.
menu "Memory power savings"
depends on X86_64
config I7300_IDLE_IOAT_CHANNEL
bool
config I7300_IDLE
tristate "Intel chipset idle memory power saving driver"
select I7300_IDLE_IOAT_CHANNEL
help
Enable memory power savings when idle with certain Intel server
chipsets. The chipset must have I/O AT support, such as the
Intel 7300. The power savings depends on the type and quantity of
DRAM devices.
endmenu
obj-$(CONFIG_I7300_IDLE) += i7300_idle.o
obj-$(CONFIG_INTEL_IDLE) += intel_idle.o obj-$(CONFIG_INTEL_IDLE) += intel_idle.o
This diff is collapsed.
...@@ -56,7 +56,6 @@ ...@@ -56,7 +56,6 @@
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/mwait.h> #include <asm/mwait.h>
#include <asm/cpu_device_id.h> #include <asm/cpu_device_id.h>
#include <asm/idle.h>
#include <asm/hardirq.h> #include <asm/hardirq.h>
#define MAX_TARGET_RATIO (50U) #define MAX_TARGET_RATIO (50U)
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/idle.h>
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/xen/pci.h> #include <asm/xen/pci.h>
...@@ -1256,7 +1255,6 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) ...@@ -1256,7 +1255,6 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
irq_enter(); irq_enter();
#ifdef CONFIG_X86 #ifdef CONFIG_X86
exit_idle();
inc_irq_stat(irq_hv_callback_count); inc_irq_stat(irq_hv_callback_count);
#endif #endif
......
...@@ -448,6 +448,8 @@ void __init parse_early_param(void) ...@@ -448,6 +448,8 @@ void __init parse_early_param(void)
done = 1; done = 1;
} }
void __init __weak arch_post_acpi_subsys_init(void) { }
void __init __weak smp_setup_processor_id(void) void __init __weak smp_setup_processor_id(void)
{ {
} }
...@@ -649,6 +651,7 @@ asmlinkage __visible void __init start_kernel(void) ...@@ -649,6 +651,7 @@ asmlinkage __visible void __init start_kernel(void)
check_bugs(); check_bugs();
acpi_subsystem_init(); acpi_subsystem_init();
arch_post_acpi_subsys_init();
sfi_init_late(); sfi_init_late();
if (efi_enabled(EFI_RUNTIME_SERVICES)) { if (efi_enabled(EFI_RUNTIME_SERVICES)) {
......
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