aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/powercap
diff options
context:
space:
mode:
authorJacob Pan <jacob.jun.pan@linux.intel.com>2014-04-29 18:33:06 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-04-30 19:32:20 -0400
commit9d31c676c6019df0c078950a0ddca87da4706b14 (patch)
tree940a8627bee078e7bf158c9128db9acd5156e15a /drivers/powercap
parentd1db0eea852497762cab43b905b879dfcd3b8987 (diff)
powercap / RAPL: further relax energy counter checks
Energy counters may roll slowly for some RAPL domains, checking all of them can be time consuming and takes unpredictable amount of time. Therefore, we relax the sanity check by only checking availability of the MSRs and non-zero value of the energy status counters. It has been shown sufficient for all the platforms tested to filter out inactive domains. Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> Acked-by: Durgadoss R <durgadoss.r@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/powercap')
-rw-r--r--drivers/powercap/intel_rapl.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c
index d9a0770b6c73..1c987d20c6b8 100644
--- a/drivers/powercap/intel_rapl.c
+++ b/drivers/powercap/intel_rapl.c
@@ -1124,8 +1124,7 @@ err_cleanup_package:
1124static int rapl_check_domain(int cpu, int domain) 1124static int rapl_check_domain(int cpu, int domain)
1125{ 1125{
1126 unsigned msr; 1126 unsigned msr;
1127 u64 val1, val2 = 0; 1127 u64 val = 0;
1128 int retry = 0;
1129 1128
1130 switch (domain) { 1129 switch (domain) {
1131 case RAPL_DOMAIN_PACKAGE: 1130 case RAPL_DOMAIN_PACKAGE:
@@ -1144,26 +1143,13 @@ static int rapl_check_domain(int cpu, int domain)
1144 pr_err("invalid domain id %d\n", domain); 1143 pr_err("invalid domain id %d\n", domain);
1145 return -EINVAL; 1144 return -EINVAL;
1146 } 1145 }
1147 if (rdmsrl_safe_on_cpu(cpu, msr, &val1)) 1146 /* make sure domain counters are available and contains non-zero
1148 return -ENODEV; 1147 * values, otherwise skip it.
1149
1150 /* PP1/uncore/graphics domain may not be active at the time of
1151 * driver loading. So skip further checks.
1152 */ 1148 */
1153 if (domain == RAPL_DOMAIN_PP1) 1149 if (rdmsrl_safe_on_cpu(cpu, msr, &val) || !val)
1154 return 0; 1150 return -ENODEV;
1155 /* energy counters roll slowly on some domains */
1156 while (++retry < 10) {
1157 usleep_range(10000, 15000);
1158 rdmsrl_safe_on_cpu(cpu, msr, &val2);
1159 if ((val1 & ENERGY_STATUS_MASK) != (val2 & ENERGY_STATUS_MASK))
1160 return 0;
1161 }
1162 /* if energy counter does not change, report as bad domain */
1163 pr_info("domain %s energy ctr %llu:%llu not working, skip\n",
1164 rapl_domain_names[domain], val1, val2);
1165 1151
1166 return -ENODEV; 1152 return 0;
1167} 1153}
1168 1154
1169/* Detect active and valid domains for the given CPU, caller must 1155/* Detect active and valid domains for the given CPU, caller must
@@ -1180,6 +1166,9 @@ static int rapl_detect_domains(struct rapl_package *rp, int cpu)
1180 /* use physical package id to read counters */ 1166 /* use physical package id to read counters */
1181 if (!rapl_check_domain(cpu, i)) 1167 if (!rapl_check_domain(cpu, i))
1182 rp->domain_map |= 1 << i; 1168 rp->domain_map |= 1 << i;
1169 else
1170 pr_warn("RAPL domain %s detection failed\n",
1171 rapl_domain_names[i]);
1183 } 1172 }
1184 rp->nr_domains = bitmap_weight(&rp->domain_map, RAPL_DOMAIN_MAX); 1173 rp->nr_domains = bitmap_weight(&rp->domain_map, RAPL_DOMAIN_MAX);
1185 if (!rp->nr_domains) { 1174 if (!rp->nr_domains) {