|
@@ -229,7 +229,8 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|
|
struct thermal_instance *instance;
|
|
|
struct power_allocator_params *params = tz->governor_data;
|
|
|
u32 *req_power, *max_power, *granted_power, *extra_actor_power;
|
|
|
- u32 total_req_power, max_allocatable_power;
|
|
|
+ u32 *weighted_req_power;
|
|
|
+ u32 total_req_power, max_allocatable_power, total_weighted_req_power;
|
|
|
u32 total_granted_power, power_range;
|
|
|
int i, num_actors, total_weight, ret = 0;
|
|
|
int trip_max_desired_temperature = params->trip_max_desired_temperature;
|
|
@@ -247,16 +248,17 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * We need to allocate three arrays of the same size:
|
|
|
- * req_power, max_power and granted_power. They are going to
|
|
|
- * be needed until this function returns. Allocate them all
|
|
|
- * in one go to simplify the allocation and deallocation
|
|
|
- * logic.
|
|
|
+ * We need to allocate five arrays of the same size:
|
|
|
+ * req_power, max_power, granted_power, extra_actor_power and
|
|
|
+ * weighted_req_power. They are going to be needed until this
|
|
|
+ * function returns. Allocate them all in one go to simplify
|
|
|
+ * the allocation and deallocation logic.
|
|
|
*/
|
|
|
BUILD_BUG_ON(sizeof(*req_power) != sizeof(*max_power));
|
|
|
BUILD_BUG_ON(sizeof(*req_power) != sizeof(*granted_power));
|
|
|
BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power));
|
|
|
- req_power = devm_kcalloc(&tz->device, num_actors * 4,
|
|
|
+ BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power));
|
|
|
+ req_power = devm_kcalloc(&tz->device, num_actors * 5,
|
|
|
sizeof(*req_power), GFP_KERNEL);
|
|
|
if (!req_power) {
|
|
|
ret = -ENOMEM;
|
|
@@ -266,8 +268,10 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|
|
max_power = &req_power[num_actors];
|
|
|
granted_power = &req_power[2 * num_actors];
|
|
|
extra_actor_power = &req_power[3 * num_actors];
|
|
|
+ weighted_req_power = &req_power[4 * num_actors];
|
|
|
|
|
|
i = 0;
|
|
|
+ total_weighted_req_power = 0;
|
|
|
total_req_power = 0;
|
|
|
max_allocatable_power = 0;
|
|
|
|
|
@@ -289,13 +293,14 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|
|
else
|
|
|
weight = instance->weight;
|
|
|
|
|
|
- req_power[i] = frac_to_int(weight * req_power[i]);
|
|
|
+ weighted_req_power[i] = frac_to_int(weight * req_power[i]);
|
|
|
|
|
|
if (power_actor_get_max_power(cdev, tz, &max_power[i]))
|
|
|
continue;
|
|
|
|
|
|
total_req_power += req_power[i];
|
|
|
max_allocatable_power += max_power[i];
|
|
|
+ total_weighted_req_power += weighted_req_power[i];
|
|
|
|
|
|
i++;
|
|
|
}
|
|
@@ -303,8 +308,9 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|
|
power_range = pid_controller(tz, current_temp, control_temp,
|
|
|
max_allocatable_power);
|
|
|
|
|
|
- divvy_up_power(req_power, max_power, num_actors, total_req_power,
|
|
|
- power_range, granted_power, extra_actor_power);
|
|
|
+ divvy_up_power(weighted_req_power, max_power, num_actors,
|
|
|
+ total_weighted_req_power, power_range, granted_power,
|
|
|
+ extra_actor_power);
|
|
|
|
|
|
total_granted_power = 0;
|
|
|
i = 0;
|