power: Add DPF and update imminent hints to AIDL

Adds FIXED_PERFORMANCE mode for the dynamic performance framework as
well as a "display update imminent hint" to the AIDL version of the
Power HAL.

Test: VtsHalPowerTargetTest
Bug: 120610745
Bug: 136285293
Bug: 146453294
Change-Id: I0cda99822eed015131f8f068512842a388f9c25c
This commit is contained in:
Dan Stoza 2020-01-13 13:06:13 -08:00
parent 9498310c3d
commit cca80279e2
4 changed files with 72 additions and 3 deletions

View file

@ -28,6 +28,13 @@ enum Boost {
*/
INTERACTION,
/**
* This boost indicates that the framework is likely to provide a new
* display frame soon. This implies that the device should ensure that the
* display processing path is powered up and ready to receive that update.
*/
DISPLAY_UPDATE_IMMINENT,
/**
* Below hints are currently not sent in Android framework but OEM might choose to
* implement for power/perf optimizations.

View file

@ -43,7 +43,7 @@ interface IPower {
*/
boolean isModeSupported(in Mode type);
/**
/**
* setBoost() indicates the device may need to boost some resources, as the
* the load is likely to increase before the kernel governors can react.
* Depending on the boost, it may be appropriate to raise the frequencies of

View file

@ -38,6 +38,50 @@ enum Mode {
*/
SUSTAINED_PERFORMANCE,
/**
* Sets the device to a fixed performance level which can be sustained under
* normal indoor conditions for at least 10 minutes.
*
* This is similar to sustained performance mode, except that whereas
* sustained performance mode puts an upper bound on performance in the
* interest of long-term stability, fixed performance mode puts both upper
* and lower bounds on performance such that any workload run while in a
* fixed performance mode should complete in a repeatable amount of time
* (except if the device is under thermal throttling).
*
* This mode is not intended for general purpose use, but rather to enable
* games and other performance-sensitive applications to reduce the number
* of variables during profiling and performance debugging. As such, while
* it is valid to set the device to minimum clocks for all subsystems in
* this mode, it is preferable to attempt to make the relative performance
* of the CPU, GPU, and other subsystems match typical usage, even if the
* frequencies have to be reduced to provide sustainability.
*
* To calibrate this mode, follow these steps:
*
* 1) Build and push the HWUI macrobench as described in
* //frameworks/base/libs/hwui/tests/macrobench/how_to_run.txt
* 2) Run the macrobench as follows:
* while true; do \
* adb shell /data/benchmarktest/hwuimacro/hwuimacro shadowgrid2 -c 200 -r 10; \
* done
* 3) Determine a fixed set of device clocks such that the loop in (2) can
* run for at least 10 minutes, starting from an idle device on a desk
* at room temperature (roughly 22 Celsius), without hitting thermal
* throttling.
* 4) After setting those clocks, set the system property
* ro.power.fixed_performance_scale_factor to a value N, where N is the
* number of times the loop from (2) runs during the 10 minute test
* cycle. It is expected that in FIXED_PERFORMANCE mode, unless there is
* thermal throttling, the loop will run N to N+1 times (inclusive).
*
* After calibrating this, while in FIXED_PERFORMANCE mode, the macrobench
* results obtained while running the loop in (2) should be consistent both
* within a given run and from the first run in the 10 minute window through
* the last run in the window.
*/
FIXED_PERFORMANCE,
/**
* This mode indicates VR Mode is activated or not. VR mode is intended
* to provide minimum guarantee for performance for the amount of time the

View file

@ -16,6 +16,7 @@
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <android-base/properties.h>
#include <android/hardware/power/Boost.h>
#include <android/hardware/power/IPower.h>
#include <android/hardware/power/Mode.h>
@ -27,6 +28,7 @@
using android::ProcessState;
using android::sp;
using android::String16;
using android::base::GetUintProperty;
using android::binder::Status;
using android::hardware::power::Boost;
using android::hardware::power::IPower;
@ -77,7 +79,7 @@ TEST_P(PowerAidl, isModeSupported) {
for (const auto& mode : kInvalidModes) {
bool supported;
ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
// Should return false for values outsides enum
// Should return false for values outside enum
ASSERT_FALSE(supported);
}
}
@ -103,11 +105,27 @@ TEST_P(PowerAidl, isBoostSupported) {
for (const auto& boost : kInvalidBoosts) {
bool supported;
ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
// Should return false for values outsides enum
// Should return false for values outside enum
ASSERT_FALSE(supported);
}
}
// FIXED_PERFORMANCE mode is required for all devices which ship on Android 11
// or later
TEST_P(PowerAidl, hasFixedPerformance) {
auto apiLevel = GetUintProperty<uint64_t>("ro.product.first_api_level", 0);
if (apiLevel == 0) {
apiLevel = GetUintProperty<uint64_t>("ro.build.version.sdk", 0);
}
ASSERT_NE(apiLevel, 0);
if (apiLevel >= 30) {
bool supported;
ASSERT_TRUE(power->isModeSupported(Mode::FIXED_PERFORMANCE, &supported).isOk());
ASSERT_TRUE(supported);
}
}
INSTANTIATE_TEST_SUITE_P(Power, PowerAidl,
testing::ValuesIn(android::getAidlHalInstanceNames(IPower::descriptor)),
android::PrintInstanceNameToString);