Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 May 2013 22:23:17 +0000 (15:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 May 2013 22:23:17 +0000 (15:23 -0700)
Pull idle update from Len Brown:
 "Add support for new Haswell-ULT CPU idle power states"

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux:
  intel_idle: initial C8, C9, C10 support
  tools/power turbostat: display C8, C9, C10 residency

1  2 
arch/x86/include/uapi/asm/msr-index.h
drivers/idle/intel_idle.c
include/linux/cpuidle.h

index b3a4866661c5c426efb0504294a3c7228ccd107a,78e852545abb3bcd7f461b3a86a0076dd6ce4b7e..2af848dfa75424b7798924dd9a91524af7f088e3
@@@ -44,7 -44,6 +44,7 @@@
  #define SNB_C1_AUTO_UNDEMOTE          (1UL << 27)
  #define SNB_C3_AUTO_UNDEMOTE          (1UL << 28)
  
 +#define MSR_PLATFORM_INFO             0x000000ce
  #define MSR_MTRRcap                   0x000000fe
  #define MSR_IA32_BBL_CR_CTL           0x00000119
  #define MSR_IA32_BBL_CR_CTL3          0x0000011e
@@@ -72,7 -71,6 +72,7 @@@
  #define MSR_IA32_PEBS_ENABLE          0x000003f1
  #define MSR_IA32_DS_AREA              0x00000600
  #define MSR_IA32_PERF_CAPABILITIES    0x00000345
 +#define MSR_PEBS_LD_LAT_THRESHOLD     0x000003f6
  
  #define MSR_MTRRfix64K_00000          0x00000250
  #define MSR_MTRRfix16K_80000          0x00000258
  #define MSR_CORE_C6_RESIDENCY         0x000003fd
  #define MSR_CORE_C7_RESIDENCY         0x000003fe
  #define MSR_PKG_C2_RESIDENCY          0x0000060d
+ #define MSR_PKG_C8_RESIDENCY          0x00000630
+ #define MSR_PKG_C9_RESIDENCY          0x00000631
+ #define MSR_PKG_C10_RESIDENCY         0x00000632
  
  /* Run Time Average Power Limiting (RAPL) Interface */
  
  #define MSR_AMD64_IBSBRTARGET         0xc001103b
  #define MSR_AMD64_IBS_REG_COUNT_MAX   8 /* includes MSR_AMD64_IBSBRTARGET */
  
 +/* Fam 16h MSRs */
 +#define MSR_F16H_L2I_PERF_CTL         0xc0010230
 +#define MSR_F16H_L2I_PERF_CTR         0xc0010231
 +
  /* Fam 15h MSRs */
  #define MSR_F15H_PERF_CTL             0xc0010200
  #define MSR_F15H_PERF_CTR             0xc0010201
  #define VMX_BASIC_MEM_TYPE_WB 6LLU
  #define VMX_BASIC_INOUT               0x0040000000000000LLU
  
 +/* MSR_IA32_VMX_MISC bits */
 +#define MSR_IA32_VMX_MISC_VMWRITE_SHADOW_RO_FIELDS (1ULL << 29)
  /* AMD-V MSRs */
  
  #define MSR_VM_CR                       0xc0010114
index 0e8fab1913dfd8737ede3b7d9f332aee0861169e,c7fbac39295259b71451751bc3fb2fffabe30c76..fa6964d8681a0d126fcf7c4845896b3f06298f8f
@@@ -71,6 -71,7 +71,6 @@@
  static struct cpuidle_driver intel_idle_driver = {
        .name = "intel_idle",
        .owner = THIS_MODULE,
 -      .en_core_tk_irqen = 1,
  };
  /* intel_idle.max_cstate=0 disables driver */
  static int max_cstate = CPUIDLE_STATE_MAX - 1;
@@@ -272,6 -273,27 +272,27 @@@ static struct cpuidle_state hsw_cstates
                .exit_latency = 166,
                .target_residency = 500,
                .enter = &intel_idle },
+       {
+               .name = "C8-HSW",
+               .desc = "MWAIT 0x40",
+               .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
+               .exit_latency = 300,
+               .target_residency = 900,
+               .enter = &intel_idle },
+       {
+               .name = "C9-HSW",
+               .desc = "MWAIT 0x50",
+               .flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
+               .exit_latency = 600,
+               .target_residency = 1800,
+               .enter = &intel_idle },
+       {
+               .name = "C10-HSW",
+               .desc = "MWAIT 0x60",
+               .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
+               .exit_latency = 2600,
+               .target_residency = 7700,
+               .enter = &intel_idle },
        {
                .enter = NULL }
  };
@@@ -338,6 -360,7 +359,6 @@@ static int intel_idle(struct cpuidle_de
        if (!(lapic_timer_reliable_states & (1 << (cstate))))
                clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
  
 -      stop_critical_timings();
        if (!need_resched()) {
  
                __monitor((void *)&current_thread_info()->flags, 0, 0);
                        __mwait(eax, ecx);
        }
  
 -      start_critical_timings();
 -
        if (!(lapic_timer_reliable_states & (1 << (cstate))))
                clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
  
diff --combined include/linux/cpuidle.h
index 3c86faa597980fbad7e17d65d7668d1da5d40e60,309f7f596b4c21443da640dd85a8722372c33d27..8f0406230a0a4890b4247e60215795c11e0a30d3
@@@ -17,7 -17,7 +17,7 @@@
  #include <linux/completion.h>
  #include <linux/hrtimer.h>
  
- #define CPUIDLE_STATE_MAX     8
+ #define CPUIDLE_STATE_MAX     10
  #define CPUIDLE_NAME_LEN      16
  #define CPUIDLE_DESC_LEN      32
  
@@@ -57,7 -57,6 +57,7 @@@ struct cpuidle_state 
  /* Idle State Flags */
  #define CPUIDLE_FLAG_TIME_VALID       (0x01) /* is residency time measurable? */
  #define CPUIDLE_FLAG_COUPLED  (0x02) /* state applies to multiple cpus */
 +#define CPUIDLE_FLAG_TIMER_STOP (0x04)  /* timer is stopped on this state */
  
  #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000)
  
@@@ -105,8 -104,8 +105,8 @@@ struct cpuidle_driver 
        struct module           *owner;
        int                     refcnt;
  
 -      /* set to 1 to use the core cpuidle time keeping (for all states). */
 -      unsigned int            en_core_tk_irqen:1;
 +        /* used by the cpuidle framework to setup the broadcast timer */
 +      unsigned int            bctimer:1;
        /* states array must be ordered in decreasing power consumption */
        struct cpuidle_state    states[CPUIDLE_STATE_MAX];
        int                     state_count;
@@@ -123,15 -122,17 +123,15 @@@ extern void cpuidle_driver_unref(void)
  extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);
  extern int cpuidle_register_device(struct cpuidle_device *dev);
  extern void cpuidle_unregister_device(struct cpuidle_device *dev);
 -
 +extern int cpuidle_register(struct cpuidle_driver *drv,
 +                          const struct cpumask *const coupled_cpus);
 +extern void cpuidle_unregister(struct cpuidle_driver *drv);
  extern void cpuidle_pause_and_lock(void);
  extern void cpuidle_resume_and_unlock(void);
  extern void cpuidle_pause(void);
  extern void cpuidle_resume(void);
  extern int cpuidle_enable_device(struct cpuidle_device *dev);
  extern void cpuidle_disable_device(struct cpuidle_device *dev);
 -extern int cpuidle_wrap_enter(struct cpuidle_device *dev,
 -                              struct cpuidle_driver *drv, int index,
 -                              int (*enter)(struct cpuidle_device *dev,
 -                                      struct cpuidle_driver *drv, int index));
  extern int cpuidle_play_dead(void);
  
  extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
@@@ -150,10 -151,7 +150,10 @@@ static inline void cpuidle_unregister_d
  static inline int cpuidle_register_device(struct cpuidle_device *dev)
  {return -ENODEV; }
  static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }
 -
 +static inline int cpuidle_register(struct cpuidle_driver *drv,
 +                                 const struct cpumask *const coupled_cpus)
 +{return -ENODEV; }
 +static inline void cpuidle_unregister(struct cpuidle_driver *drv) { }
  static inline void cpuidle_pause_and_lock(void) { }
  static inline void cpuidle_resume_and_unlock(void) { }
  static inline void cpuidle_pause(void) { }
@@@ -161,6 -159,11 +161,6 @@@ static inline void cpuidle_resume(void
  static inline int cpuidle_enable_device(struct cpuidle_device *dev)
  {return -ENODEV; }
  static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
 -static inline int cpuidle_wrap_enter(struct cpuidle_device *dev,
 -                              struct cpuidle_driver *drv, int index,
 -                              int (*enter)(struct cpuidle_device *dev,
 -                                      struct cpuidle_driver *drv, int index))
 -{ return -ENODEV; }
  static inline int cpuidle_play_dead(void) {return -ENODEV; }
  #endif