diff options
| -rw-r--r-- | drivers/thermal/power_allocator.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/thermal/power_allocator.c b/drivers/thermal/power_allocator.c index 4672250b329f..63a448f9d93b 100644 --- a/drivers/thermal/power_allocator.c +++ b/drivers/thermal/power_allocator.c | |||
| @@ -229,7 +229,8 @@ static int allocate_power(struct thermal_zone_device *tz, | |||
| 229 | struct thermal_instance *instance; | 229 | struct thermal_instance *instance; |
| 230 | struct power_allocator_params *params = tz->governor_data; | 230 | struct power_allocator_params *params = tz->governor_data; |
| 231 | u32 *req_power, *max_power, *granted_power, *extra_actor_power; | 231 | u32 *req_power, *max_power, *granted_power, *extra_actor_power; |
| 232 | u32 total_req_power, max_allocatable_power; | 232 | u32 *weighted_req_power; |
| 233 | u32 total_req_power, max_allocatable_power, total_weighted_req_power; | ||
| 233 | u32 total_granted_power, power_range; | 234 | u32 total_granted_power, power_range; |
| 234 | int i, num_actors, total_weight, ret = 0; | 235 | int i, num_actors, total_weight, ret = 0; |
| 235 | int trip_max_desired_temperature = params->trip_max_desired_temperature; | 236 | int trip_max_desired_temperature = params->trip_max_desired_temperature; |
| @@ -247,16 +248,17 @@ static int allocate_power(struct thermal_zone_device *tz, | |||
| 247 | } | 248 | } |
| 248 | 249 | ||
| 249 | /* | 250 | /* |
| 250 | * We need to allocate three arrays of the same size: | 251 | * We need to allocate five arrays of the same size: |
| 251 | * req_power, max_power and granted_power. They are going to | 252 | * req_power, max_power, granted_power, extra_actor_power and |
| 252 | * be needed until this function returns. Allocate them all | 253 | * weighted_req_power. They are going to be needed until this |
| 253 | * in one go to simplify the allocation and deallocation | 254 | * function returns. Allocate them all in one go to simplify |
| 254 | * logic. | 255 | * the allocation and deallocation logic. |
| 255 | */ | 256 | */ |
| 256 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*max_power)); | 257 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*max_power)); |
| 257 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*granted_power)); | 258 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*granted_power)); |
| 258 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power)); | 259 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power)); |
| 259 | req_power = devm_kcalloc(&tz->device, num_actors * 4, | 260 | BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power)); |
| 261 | req_power = devm_kcalloc(&tz->device, num_actors * 5, | ||
| 260 | sizeof(*req_power), GFP_KERNEL); | 262 | sizeof(*req_power), GFP_KERNEL); |
| 261 | if (!req_power) { | 263 | if (!req_power) { |
| 262 | ret = -ENOMEM; | 264 | ret = -ENOMEM; |
| @@ -266,8 +268,10 @@ static int allocate_power(struct thermal_zone_device *tz, | |||
| 266 | max_power = &req_power[num_actors]; | 268 | max_power = &req_power[num_actors]; |
| 267 | granted_power = &req_power[2 * num_actors]; | 269 | granted_power = &req_power[2 * num_actors]; |
| 268 | extra_actor_power = &req_power[3 * num_actors]; | 270 | extra_actor_power = &req_power[3 * num_actors]; |
| 271 | weighted_req_power = &req_power[4 * num_actors]; | ||
| 269 | 272 | ||
| 270 | i = 0; | 273 | i = 0; |
| 274 | total_weighted_req_power = 0; | ||
| 271 | total_req_power = 0; | 275 | total_req_power = 0; |
| 272 | max_allocatable_power = 0; | 276 | max_allocatable_power = 0; |
| 273 | 277 | ||
| @@ -289,13 +293,14 @@ static int allocate_power(struct thermal_zone_device *tz, | |||
| 289 | else | 293 | else |
| 290 | weight = instance->weight; | 294 | weight = instance->weight; |
| 291 | 295 | ||
| 292 | req_power[i] = frac_to_int(weight * req_power[i]); | 296 | weighted_req_power[i] = frac_to_int(weight * req_power[i]); |
| 293 | 297 | ||
| 294 | if (power_actor_get_max_power(cdev, tz, &max_power[i])) | 298 | if (power_actor_get_max_power(cdev, tz, &max_power[i])) |
| 295 | continue; | 299 | continue; |
| 296 | 300 | ||
| 297 | total_req_power += req_power[i]; | 301 | total_req_power += req_power[i]; |
| 298 | max_allocatable_power += max_power[i]; | 302 | max_allocatable_power += max_power[i]; |
| 303 | total_weighted_req_power += weighted_req_power[i]; | ||
| 299 | 304 | ||
| 300 | i++; | 305 | i++; |
| 301 | } | 306 | } |
| @@ -303,8 +308,9 @@ static int allocate_power(struct thermal_zone_device *tz, | |||
| 303 | power_range = pid_controller(tz, current_temp, control_temp, | 308 | power_range = pid_controller(tz, current_temp, control_temp, |
| 304 | max_allocatable_power); | 309 | max_allocatable_power); |
| 305 | 310 | ||
| 306 | divvy_up_power(req_power, max_power, num_actors, total_req_power, | 311 | divvy_up_power(weighted_req_power, max_power, num_actors, |
| 307 | power_range, granted_power, extra_actor_power); | 312 | total_weighted_req_power, power_range, granted_power, |
| 313 | extra_actor_power); | ||
| 308 | 314 | ||
| 309 | total_granted_power = 0; | 315 | total_granted_power = 0; |
| 310 | i = 0; | 316 | i = 0; |
