aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/powercap/intel_rapl.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c
index 243b233ff31b..94b9901d192f 100644
--- a/drivers/powercap/intel_rapl.c
+++ b/drivers/powercap/intel_rapl.c
@@ -1164,24 +1164,20 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
1164}; 1164};
1165MODULE_DEVICE_TABLE(x86cpu, rapl_ids); 1165MODULE_DEVICE_TABLE(x86cpu, rapl_ids);
1166 1166
1167/* read once for all raw primitive data for all packages, domains */ 1167/* Read once for all raw primitive data for domains */
1168static void rapl_update_domain_data(void) 1168static void rapl_update_domain_data(struct rapl_package *rp)
1169{ 1169{
1170 int dmn, prim; 1170 int dmn, prim;
1171 u64 val; 1171 u64 val;
1172 struct rapl_package *rp;
1173 1172
1174 list_for_each_entry(rp, &rapl_packages, plist) { 1173 for (dmn = 0; dmn < rp->nr_domains; dmn++) {
1175 for (dmn = 0; dmn < rp->nr_domains; dmn++) { 1174 pr_debug("update package %d domain %s data\n", rp->id,
1176 pr_debug("update package %d domain %s data\n", rp->id, 1175 rp->domains[dmn].name);
1177 rp->domains[dmn].name); 1176 /* exclude non-raw primitives */
1178 /* exclude non-raw primitives */ 1177 for (prim = 0; prim < NR_RAW_PRIMITIVES; prim++) {
1179 for (prim = 0; prim < NR_RAW_PRIMITIVES; prim++) 1178 if (!rapl_read_data_raw(&rp->domains[dmn], prim,
1180 if (!rapl_read_data_raw(&rp->domains[dmn], prim, 1179 rpi[prim].unit, &val))
1181 rpi[prim].unit, 1180 rp->domains[dmn].rdd.primitives[prim] = val;
1182 &val))
1183 rp->domains[dmn].rdd.primitives[prim] =
1184 val;
1185 } 1181 }
1186 } 1182 }
1187 1183
@@ -1234,10 +1230,12 @@ static int rapl_unregister_powercap(void)
1234static int rapl_package_register_powercap(struct rapl_package *rp) 1230static int rapl_package_register_powercap(struct rapl_package *rp)
1235{ 1231{
1236 struct rapl_domain *rd; 1232 struct rapl_domain *rd;
1237 int ret = 0;
1238 char dev_name[17]; /* max domain name = 7 + 1 + 8 for int + 1 for null*/ 1233 char dev_name[17]; /* max domain name = 7 + 1 + 8 for int + 1 for null*/
1239 struct powercap_zone *power_zone = NULL; 1234 struct powercap_zone *power_zone = NULL;
1240 int nr_pl; 1235 int nr_pl, ret;;
1236
1237 /* Update the domain data of the new package */
1238 rapl_update_domain_data(rp);
1241 1239
1242 /* first we register package domain as the parent zone*/ 1240 /* first we register package domain as the parent zone*/
1243 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) { 1241 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
@@ -1257,8 +1255,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1257 if (IS_ERR(power_zone)) { 1255 if (IS_ERR(power_zone)) {
1258 pr_debug("failed to register package, %d\n", 1256 pr_debug("failed to register package, %d\n",
1259 rp->id); 1257 rp->id);
1260 ret = PTR_ERR(power_zone); 1258 return PTR_ERR(power_zone);
1261 goto exit_package;
1262 } 1259 }
1263 /* track parent zone in per package/socket data */ 1260 /* track parent zone in per package/socket data */
1264 rp->power_zone = power_zone; 1261 rp->power_zone = power_zone;
@@ -1268,8 +1265,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1268 } 1265 }
1269 if (!power_zone) { 1266 if (!power_zone) {
1270 pr_err("no package domain found, unknown topology!\n"); 1267 pr_err("no package domain found, unknown topology!\n");
1271 ret = -ENODEV; 1268 return -ENODEV;
1272 goto exit_package;
1273 } 1269 }
1274 /* now register domains as children of the socket/package*/ 1270 /* now register domains as children of the socket/package*/
1275 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) { 1271 for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
@@ -1290,9 +1286,8 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1290 goto err_cleanup; 1286 goto err_cleanup;
1291 } 1287 }
1292 } 1288 }
1289 return 0;
1293 1290
1294exit_package:
1295 return ret;
1296err_cleanup: 1291err_cleanup:
1297 /* clean up previously initialized domains within the package if we 1292 /* clean up previously initialized domains within the package if we
1298 * failed after the first domain setup. 1293 * failed after the first domain setup.
@@ -1357,8 +1352,7 @@ static int rapl_register_powercap(void)
1357 pr_debug("failed to register powercap control_type.\n"); 1352 pr_debug("failed to register powercap control_type.\n");
1358 return PTR_ERR(control_type); 1353 return PTR_ERR(control_type);
1359 } 1354 }
1360 /* read the initial data */ 1355
1361 rapl_update_domain_data();
1362 list_for_each_entry(rp, &rapl_packages, plist) 1356 list_for_each_entry(rp, &rapl_packages, plist)
1363 if (rapl_package_register_powercap(rp)) 1357 if (rapl_package_register_powercap(rp))
1364 goto err_cleanup_package; 1358 goto err_cleanup_package;