diff options
-rw-r--r-- | drivers/powercap/intel_rapl.c | 42 |
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 | }; |
1165 | MODULE_DEVICE_TABLE(x86cpu, rapl_ids); | 1165 | MODULE_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 */ |
1168 | static void rapl_update_domain_data(void) | 1168 | static 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) | |||
1234 | static int rapl_package_register_powercap(struct rapl_package *rp) | 1230 | static 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 | ||
1294 | exit_package: | ||
1295 | return ret; | ||
1296 | err_cleanup: | 1291 | err_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; |