Linus,

Please pull the latest x86-cpu-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-cpu-for-linus

   # HEAD: b1c599b8ff80ea79b9f8277a3f9f36a7b0cfedce x86/cpufeature: Add feature 
bit for Intel's Silicon Debug CPUID bit

Two changes: a suspend/resume quirk and a new CPUID bit definition.

 Thanks,

        Ingo

------------------>
Laura Abbott (1):
      x86/cpu: Restore MSR_IA32_ENERGY_PERF_BIAS after resume

Mathias Krause (1):
      x86/cpufeature: Add feature bit for Intel's Silicon Debug CPUID bit


 arch/x86/include/asm/cpufeature.h |  1 +
 arch/x86/kernel/cpu/common.c      | 18 +++++++++++++++
 arch/x86/kernel/cpu/cpu.h         |  1 +
 arch/x86/kernel/cpu/intel.c       | 47 ++++++++++++++++++++++++++-------------
 4 files changed, 52 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/cpufeature.h 
b/arch/x86/include/asm/cpufeature.h
index 3d6606fb97d0..4b11974b4ea7 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -119,6 +119,7 @@
 #define X86_FEATURE_TM2                ( 4*32+ 8) /* Thermal Monitor 2 */
 #define X86_FEATURE_SSSE3      ( 4*32+ 9) /* Supplemental SSE-3 */
 #define X86_FEATURE_CID                ( 4*32+10) /* Context ID */
+#define X86_FEATURE_SDBG       ( 4*32+11) /* Silicon Debug */
 #define X86_FEATURE_FMA                ( 4*32+12) /* Fused multiply-add */
 #define X86_FEATURE_CX16       ( 4*32+13) /* CMPXCHG16B */
 #define X86_FEATURE_XTPR       ( 4*32+14) /* Send Task Priority Messages */
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 922c5e0cea4c..fa95bb8829ce 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -13,6 +13,7 @@
 #include <linux/kgdb.h>
 #include <linux/smp.h>
 #include <linux/io.h>
+#include <linux/syscore_ops.h>
 
 #include <asm/stackprotector.h>
 #include <asm/perf_event.h>
@@ -1488,3 +1489,20 @@ inline bool __static_cpu_has_safe(u16 bit)
        return boot_cpu_has(bit);
 }
 EXPORT_SYMBOL_GPL(__static_cpu_has_safe);
+
+static void bsp_resume(void)
+{
+       if (this_cpu->c_bsp_resume)
+               this_cpu->c_bsp_resume(&boot_cpu_data);
+}
+
+static struct syscore_ops cpu_syscore_ops = {
+       .resume         = bsp_resume,
+};
+
+static int __init init_cpu_syscore(void)
+{
+       register_syscore_ops(&cpu_syscore_ops);
+       return 0;
+}
+core_initcall(init_cpu_syscore);
diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
index c37dc37e8317..2584265d4745 100644
--- a/arch/x86/kernel/cpu/cpu.h
+++ b/arch/x86/kernel/cpu/cpu.h
@@ -13,6 +13,7 @@ struct cpu_dev {
        void            (*c_init)(struct cpuinfo_x86 *);
        void            (*c_identify)(struct cpuinfo_x86 *);
        void            (*c_detect_tlb)(struct cpuinfo_x86 *);
+       void            (*c_bsp_resume)(struct cpuinfo_x86 *);
        int             c_x86_vendor;
 #ifdef CONFIG_X86_32
        /* Optional vendor specific routine to obtain the cache size. */
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 50163fa9034f..98a13db5f4be 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -371,6 +371,36 @@ static void detect_vmx_virtcap(struct cpuinfo_x86 *c)
        }
 }
 
+static void init_intel_energy_perf(struct cpuinfo_x86 *c)
+{
+       u64 epb;
+
+       /*
+        * Initialize MSR_IA32_ENERGY_PERF_BIAS if not already initialized.
+        * (x86_energy_perf_policy(8) is available to change it at run-time.)
+        */
+       if (!cpu_has(c, X86_FEATURE_EPB))
+               return;
+
+       rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
+       if ((epb & 0xF) != ENERGY_PERF_BIAS_PERFORMANCE)
+               return;
+
+       pr_warn_once("ENERGY_PERF_BIAS: Set to 'normal', was 'performance'\n");
+       pr_warn_once("ENERGY_PERF_BIAS: View and update with 
x86_energy_perf_policy(8)\n");
+       epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
+       wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
+}
+
+static void intel_bsp_resume(struct cpuinfo_x86 *c)
+{
+       /*
+        * MSR_IA32_ENERGY_PERF_BIAS is lost across suspend/resume,
+        * so reinitialize it properly like during bootup:
+        */
+       init_intel_energy_perf(c);
+}
+
 static void init_intel(struct cpuinfo_x86 *c)
 {
        unsigned int l2 = 0;
@@ -478,21 +508,7 @@ static void init_intel(struct cpuinfo_x86 *c)
        if (cpu_has(c, X86_FEATURE_VMX))
                detect_vmx_virtcap(c);
 
-       /*
-        * Initialize MSR_IA32_ENERGY_PERF_BIAS if BIOS did not.
-        * x86_energy_perf_policy(8) is available to change it at run-time
-        */
-       if (cpu_has(c, X86_FEATURE_EPB)) {
-               u64 epb;
-
-               rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
-               if ((epb & 0xF) == ENERGY_PERF_BIAS_PERFORMANCE) {
-                       pr_warn_once("ENERGY_PERF_BIAS: Set to 'normal', was 
'performance'\n");
-                       pr_warn_once("ENERGY_PERF_BIAS: View and update with 
x86_energy_perf_policy(8)\n");
-                       epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
-                       wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
-               }
-       }
+       init_intel_energy_perf(c);
 }
 
 #ifdef CONFIG_X86_32
@@ -747,6 +763,7 @@ static const struct cpu_dev intel_cpu_dev = {
        .c_detect_tlb   = intel_detect_tlb,
        .c_early_init   = early_init_intel,
        .c_init         = init_intel,
+       .c_bsp_resume   = intel_bsp_resume,
        .c_x86_vendor   = X86_VENDOR_INTEL,
 };
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to