aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIonela Voinescu <ionela.voinescu@arm.com>2019-02-01 14:15:03 +0000
committerArvind Chauhan <arvind.chauhan@arm.com>2019-02-08 11:50:54 +0530
commitbdec7ca39e89d6b235738bde6c3fe6fb0bf5d361 (patch)
tree6dc32242a438b1f2de8e3456777322cfc876b1d7
parent3b746c2d607d5a41b0689c80e076641f05098510 (diff)
power_allocator: properly split power range when all requests are 0testing-ack-4.14-armlt
When all requests coming from all agents are 0, there is no power granted and the extra_power will remain 0 as no power was allocated in order to exceed the maximum allowed by the device. Therefore, the divvy_up_power function will not allocate the power_range at all. Add an extra check that verifies if the requested power is 0, case for which we'll consider the full power range as extra power. This will be allocated as before depending on how far each actor is from its maximum - in this case based on the power range of each actor. Change-Id: I7d303c685ae7288680c9579d6d52895447b00237 Reported-by: Jose Marinho <jose.marinho@arm.com> Signed-off-by: Ionela Voinescu <ionela.voinescu@arm.com>
-rw-r--r--drivers/thermal/power_allocator.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/thermal/power_allocator.c b/drivers/thermal/power_allocator.c
index 3055f9a12a17..9caa3ed3fe85 100644
--- a/drivers/thermal/power_allocator.c
+++ b/drivers/thermal/power_allocator.c
@@ -289,7 +289,8 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors,
u32 total_req_power, u32 power_range,
u32 *granted_power, u32 *extra_actor_power)
{
- u32 extra_power, capped_extra_power;
+ u32 extra_power = 0, capped_extra_power = 0;
+ bool has_requested_power = !!total_req_power;
int i;
/*
@@ -298,8 +299,6 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors,
if (!total_req_power)
total_req_power = 1;
- capped_extra_power = 0;
- extra_power = 0;
for (i = 0; i < num_actors; i++) {
u64 req_range = (u64)req_power[i] * power_range;
@@ -315,6 +314,13 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors,
capped_extra_power += extra_actor_power[i];
}
+ /*
+ * If nobody has requested any power, and therefore nobody was granted
+ * any power, split the power_range between all the actors.
+ */
+ if (!has_requested_power)
+ extra_power = power_range;
+
if (!extra_power)
return;