From 1c60f2342b752149f3d6543c63fee11a167dc998 Mon Sep 17 00:00:00 2001 From: "David E. Box" Date: Thu, 2 Apr 2015 21:24:29 -0700 Subject: [PATCH] Fix Powertop support for Intel Braswell SOC Correct Braswell MSR used to determine PC6 residency. Signed-off-by: David E. Box --- src/cpu/intel_cpus.cpp | 21 +++++++++++++++++++-- src/cpu/intel_cpus.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/cpu/intel_cpus.cpp b/src/cpu/intel_cpus.cpp index d96cb49..1f3647a 100644 --- a/src/cpu/intel_cpus.cpp +++ b/src/cpu/intel_cpus.cpp @@ -289,6 +289,7 @@ nhm_package::nhm_package(int model) has_c8c9c10_res = 0; has_c2c6_res = 0; has_c7_res = 0; + has_c6c_res = 0; switch(model) { case 0x2A: /* SNB */ @@ -314,6 +315,9 @@ nhm_package::nhm_package(int model) else has_c7_res = 0; } + /* BSW only exposes package C6 */ + else if (model == 0x4C) + has_c6c_res = 1; else has_c3_res = 1; @@ -360,7 +364,15 @@ void nhm_package::measurement_start(void) if (this->has_c3_res) c3_before = get_msr(number, MSR_PKG_C3_RESIDENCY); - c6_before = get_msr(number, MSR_PKG_C6_RESIDENCY); + + /* + * Hack for Braswell where C7 MSR is actually BSW C6 + */ + if (this->has_c6c_res) + c6_before = get_msr(number, MSR_PKG_C7_RESIDENCY); + else + c6_before = get_msr(number, MSR_PKG_C6_RESIDENCY); + if (this->has_c7_res) c7_before = get_msr(number, MSR_PKG_C7_RESIDENCY); if (this->has_c8c9c10_res) { @@ -401,7 +413,12 @@ void nhm_package::measurement_end(void) if (this->has_c3_res) c3_after = get_msr(number, MSR_PKG_C3_RESIDENCY); - c6_after = get_msr(number, MSR_PKG_C6_RESIDENCY); + + if (this->has_c6c_res) + c6_after = get_msr(number, MSR_PKG_C7_RESIDENCY); + else + c6_after = get_msr(number, MSR_PKG_C6_RESIDENCY); + if (this->has_c7_res) c7_after = get_msr(number, MSR_PKG_C7_RESIDENCY); if (has_c8c9c10_res) { diff --git a/src/cpu/intel_cpus.h b/src/cpu/intel_cpus.h index 810a243..0331069 100644 --- a/src/cpu/intel_cpus.h +++ b/src/cpu/intel_cpus.h @@ -77,6 +77,7 @@ public: int has_c7_res; int has_c2c6_res; int has_c3_res; + int has_c6c_res; /* BSW */ int has_c8c9c10_res; nhm_package(int model); virtual void measurement_start(void); -- 2.4.4