summaryrefslogtreecommitdiff
blob: cabbed44ed03e71c5b5940a8eea415d3e23943fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
From 1c60f2342b752149f3d6543c63fee11a167dc998 Mon Sep 17 00:00:00 2001
From: "David E. Box" <david.e.box@linux.intel.com>
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 <david.e.box@linux.intel.com>
---
 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