Loading arch/x86/include/asm/msr-index.h +5 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,11 @@ #define MSR_IA32_PERFCTR1 0x000000c2 #define MSR_FSB_FREQ 0x000000cd #define MSR_NHM_SNB_PKG_CST_CFG_CTL 0x000000e2 #define NHM_C3_AUTO_DEMOTE (1UL << 25) #define NHM_C1_AUTO_DEMOTE (1UL << 26) #define ATM_LNC_C6_AUTO_DEMOTE (1UL << 25) #define MSR_MTRRcap 0x000000fe #define MSR_IA32_BBL_CR_CTL 0x00000119 Loading drivers/idle/intel_idle.c +24 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ #include <linux/notifier.h> #include <linux/cpu.h> #include <asm/mwait.h> #include <asm/msr.h> #define INTEL_IDLE_VERSION "0.4" #define PREFIX "intel_idle: " Loading @@ -84,6 +85,12 @@ static int intel_idle(struct cpuidle_device *dev, struct cpuidle_state *state); static struct cpuidle_state *cpuidle_state_table; /* * Hardware C-state auto-demotion may not always be optimal. * Indicate which enable bits to clear here. */ static unsigned long long auto_demotion_disable_flags; /* * Set this flag for states where the HW flushes the TLB for us * and so we don't need cross-calls to keep it consistent. Loading Loading @@ -281,6 +288,15 @@ static struct notifier_block setup_broadcast_notifier = { .notifier_call = setup_broadcast_cpuhp_notify, }; static void auto_demotion_disable(void *dummy) { unsigned long long msr_bits; rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); msr_bits &= ~auto_demotion_disable_flags; wrmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); } /* * intel_idle_probe() */ Loading Loading @@ -324,11 +340,17 @@ static int intel_idle_probe(void) case 0x25: /* Westmere */ case 0x2C: /* Westmere */ cpuidle_state_table = nehalem_cstates; auto_demotion_disable_flags = (NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE); break; case 0x1C: /* 28 - Atom Processor */ cpuidle_state_table = atom_cstates; break; case 0x26: /* 38 - Lincroft Atom Processor */ cpuidle_state_table = atom_cstates; auto_demotion_disable_flags = ATM_LNC_C6_AUTO_DEMOTE; break; case 0x2A: /* SNB */ Loading Loading @@ -436,6 +458,8 @@ static int intel_idle_cpuidle_devices_init(void) return -EIO; } } if (auto_demotion_disable_flags) smp_call_function(auto_demotion_disable, NULL, 1); return 0; } Loading Loading
arch/x86/include/asm/msr-index.h +5 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,11 @@ #define MSR_IA32_PERFCTR1 0x000000c2 #define MSR_FSB_FREQ 0x000000cd #define MSR_NHM_SNB_PKG_CST_CFG_CTL 0x000000e2 #define NHM_C3_AUTO_DEMOTE (1UL << 25) #define NHM_C1_AUTO_DEMOTE (1UL << 26) #define ATM_LNC_C6_AUTO_DEMOTE (1UL << 25) #define MSR_MTRRcap 0x000000fe #define MSR_IA32_BBL_CR_CTL 0x00000119 Loading
drivers/idle/intel_idle.c +24 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ #include <linux/notifier.h> #include <linux/cpu.h> #include <asm/mwait.h> #include <asm/msr.h> #define INTEL_IDLE_VERSION "0.4" #define PREFIX "intel_idle: " Loading @@ -84,6 +85,12 @@ static int intel_idle(struct cpuidle_device *dev, struct cpuidle_state *state); static struct cpuidle_state *cpuidle_state_table; /* * Hardware C-state auto-demotion may not always be optimal. * Indicate which enable bits to clear here. */ static unsigned long long auto_demotion_disable_flags; /* * Set this flag for states where the HW flushes the TLB for us * and so we don't need cross-calls to keep it consistent. Loading Loading @@ -281,6 +288,15 @@ static struct notifier_block setup_broadcast_notifier = { .notifier_call = setup_broadcast_cpuhp_notify, }; static void auto_demotion_disable(void *dummy) { unsigned long long msr_bits; rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); msr_bits &= ~auto_demotion_disable_flags; wrmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); } /* * intel_idle_probe() */ Loading Loading @@ -324,11 +340,17 @@ static int intel_idle_probe(void) case 0x25: /* Westmere */ case 0x2C: /* Westmere */ cpuidle_state_table = nehalem_cstates; auto_demotion_disable_flags = (NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE); break; case 0x1C: /* 28 - Atom Processor */ cpuidle_state_table = atom_cstates; break; case 0x26: /* 38 - Lincroft Atom Processor */ cpuidle_state_table = atom_cstates; auto_demotion_disable_flags = ATM_LNC_C6_AUTO_DEMOTE; break; case 0x2A: /* SNB */ Loading Loading @@ -436,6 +458,8 @@ static int intel_idle_cpuidle_devices_init(void) return -EIO; } } if (auto_demotion_disable_flags) smp_call_function(auto_demotion_disable, NULL, 1); return 0; } Loading