diff options
author | Ionela Voinescu <ionela.voinescu@arm.com> | 2019-02-01 14:15:03 +0000 |
---|---|---|
committer | Arvind Chauhan <arvind.chauhan@arm.com> | 2019-02-08 11:50:54 +0530 |
commit | bdec7ca39e89d6b235738bde6c3fe6fb0bf5d361 (patch) | |
tree | 6dc32242a438b1f2de8e3456777322cfc876b1d7 | |
parent | 3b746c2d607d5a41b0689c80e076641f05098510 (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.c | 12 |
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; |