diff options
-rw-r--r-- | power-8084.c | 102 | ||||
-rw-r--r-- | power-8226.c | 46 | ||||
-rw-r--r-- | power-8610.c | 46 | ||||
-rw-r--r-- | power-8916.c | 116 | ||||
-rw-r--r-- | power-8974.c | 99 | ||||
-rw-r--r-- | power-8992.c | 91 | ||||
-rw-r--r-- | power-8994.c | 91 |
7 files changed, 571 insertions, 20 deletions
diff --git a/power-8084.c b/power-8084.c index 8612769..4ed01a7 100644 --- a/power-8084.c +++ b/power-8084.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -125,6 +126,100 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +/* fling boost: min 3 CPUs, min 1.1 GHz */ +static int resources_interaction_fling_boost[] = { + CPUS_ONLINE_MIN_3, + CPU0_MIN_FREQ_NONTURBO_MAX + 1, + CPU1_MIN_FREQ_NONTURBO_MAX + 1, + CPU2_MIN_FREQ_NONTURBO_MAX + 1, + CPU3_MIN_FREQ_NONTURBO_MAX + 1 +}; + +/* interactive boost: min 2 CPUs, min 1.1 GHz */ +static int resources_interaction_boost[] = { + CPUS_ONLINE_MIN_2, + CPU0_MIN_FREQ_NONTURBO_MAX + 1, + CPU1_MIN_FREQ_NONTURBO_MAX + 1, + CPU2_MIN_FREQ_NONTURBO_MAX + 1, + CPU3_MIN_FREQ_NONTURBO_MAX + 1 +}; + +/* lauch boost: min 2 CPUs, full power for 2 CPUs, min 1.5 GHz for the others */ +static int resources_launch[] = { + CPUS_ONLINE_MIN_2, + CPU0_MIN_FREQ_TURBO_MAX, + CPU1_MIN_FREQ_TURBO_MAX, + CPU2_MIN_FREQ_NONTURBO_MAX + 5, + CPU3_MIN_FREQ_NONTURBO_MAX + 5 +}; +// clang-format on + +const int kDefaultInteractiveDuration = 200; /* ms */ +const int kMinFlingDuration = 1500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + if (duration >= kMinFlingDuration) { + interaction(duration, ARRAY_SIZE(resources_interaction_fling_boost), + resources_interaction_fling_boost); + } else { + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); + } +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (!launch_mode) { + launch_handle = interaction_with_handle(launch_handle, kMaxLaunchDuration, + ARRAY_SIZE(resources_launch), resources_launch); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -134,6 +229,13 @@ int power_hint_override(power_hint_t hint, void* data) { case POWER_HINT_VIDEO_DECODE: ret_val = process_video_decode_hint(data); break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: break; } diff --git a/power-8226.c b/power-8226.c index b654923..7f5ff72 100644 --- a/power-8226.c +++ b/power-8226.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -123,6 +124,46 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_boost[] = { + CPUS_ONLINE_MIN_2, + 0x20B, + 0x30B +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -133,10 +174,7 @@ int power_hint_override(power_hint_t hint, void* data) { ret_val = process_video_decode_hint(data); break; case POWER_HINT_INTERACTION: - int resources[] = {CPUS_ONLINE_MIN_2, 0x20B, 0x30B}; - int duration = 3000; - - interaction(duration, ARRAY_SIZE(resources), resources); + process_interaction_hint(data); ret_val = HINT_HANDLED; break; default: diff --git a/power-8610.c b/power-8610.c index b654923..7f5ff72 100644 --- a/power-8610.c +++ b/power-8610.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -123,6 +124,46 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_boost[] = { + CPUS_ONLINE_MIN_2, + 0x20B, + 0x30B +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -133,10 +174,7 @@ int power_hint_override(power_hint_t hint, void* data) { ret_val = process_video_decode_hint(data); break; case POWER_HINT_INTERACTION: - int resources[] = {CPUS_ONLINE_MIN_2, 0x20B, 0x30B}; - int duration = 3000; - - interaction(duration, ARRAY_SIZE(resources), resources); + process_interaction_hint(data); ret_val = HINT_HANDLED; break; default: diff --git a/power-8916.c b/power-8916.c index 25011bc..fedda05 100644 --- a/power-8916.c +++ b/power-8916.c @@ -36,6 +36,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -71,23 +72,114 @@ static bool is_target_8916(void) { return is_8916; } -int power_hint_override(power_hint_t hint, void* UNUSED(data)) { - switch (hint) { - case POWER_HINT_VSYNC: - break; - case POWER_HINT_INTERACTION: { - int resources[] = {CPUS_ONLINE_MIN_2, 0x20F, 0x30F}; - int duration = 3000; +// clang-format off +static int resources_interaction_fling_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_BOOST_ON, + SCHED_PREFER_IDLE_DIS, + 0x20D +}; + +static int resources_interaction_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_PREFER_IDLE_DIS, + 0x20D +}; + +static int resources_launch[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_BOOST_ON, + SCHED_PREFER_IDLE_DIS, + 0x20F, + 0x1C00, + 0x4001, + 0x4101, + 0x4201 +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMinFlingDuration = 1500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + if (duration >= kMinFlingDuration) { + interaction(duration, ARRAY_SIZE(resources_interaction_fling_boost), + resources_interaction_fling_boost); + } else { + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); + } +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } - interaction(duration, ARRAY_SIZE(resources), resources); - return HINT_HANDLED; + if (!launch_mode) { + launch_handle = interaction_with_handle(launch_handle, kMaxLaunchDuration, + ARRAY_SIZE(resources_launch), resources_launch); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; } + launch_mode = 1; + } + return HINT_HANDLED; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { case POWER_HINT_VIDEO_ENCODE: /* Do nothing for encode case */ - return HINT_HANDLED; + ret_val = HINT_HANDLED; + break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: - return HINT_HANDLED; + break; } - return HINT_NONE; + return ret_val; } int set_interactive_override(int on) { diff --git a/power-8974.c b/power-8974.c index e5ddf0f..9b9a52d 100644 --- a/power-8974.c +++ b/power-8974.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -140,6 +141,97 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_fling_boost[] = { + CPUS_ONLINE_MIN_3, + 0x20F, + 0x30F, + 0x40F, + 0x50F +}; + +static int resources_interaction_boost[] = { + CPUS_ONLINE_MIN_2, + 0x20F, + 0x30F, + 0x40F, + 0x50F +}; + +static int resources_launch[] = { + CPUS_ONLINE_MIN_3, + CPU0_MIN_FREQ_TURBO_MAX, + CPU1_MIN_FREQ_TURBO_MAX, + CPU2_MIN_FREQ_TURBO_MAX, + CPU3_MIN_FREQ_TURBO_MAX +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMinFlingDuration = 1500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + if (duration >= kMinFlingDuration) { + interaction(duration, ARRAY_SIZE(resources_interaction_fling_boost), + resources_interaction_fling_boost); + } else { + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); + } +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (!launch_mode) { + launch_handle = interaction_with_handle(launch_handle, kMaxLaunchDuration, + ARRAY_SIZE(resources_launch), resources_launch); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -149,6 +241,13 @@ int power_hint_override(power_hint_t hint, void* data) { case POWER_HINT_VIDEO_DECODE: ret_val = process_video_decode_hint(data); break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: break; } diff --git a/power-8992.c b/power-8992.c index b102017..6fc62d3 100644 --- a/power-8992.c +++ b/power-8992.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -128,6 +129,89 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_fling_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_BOOST_ON, + SCHED_PREFER_IDLE_DIS +}; + +static int resources_interaction_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_PREFER_IDLE_DIS +}; + +static int resources_launch[] = { + SCHED_BOOST_ON, + 0x20C +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMinFlingDuration = 1500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + if (duration >= kMinFlingDuration) { + interaction(duration, ARRAY_SIZE(resources_interaction_fling_boost), + resources_interaction_fling_boost); + } else { + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); + } +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (!launch_mode) { + launch_handle = interaction_with_handle(launch_handle, kMaxLaunchDuration, + ARRAY_SIZE(resources_launch), resources_launch); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -137,6 +221,13 @@ int power_hint_override(power_hint_t hint, void* data) { case POWER_HINT_VIDEO_DECODE: ret_val = process_video_decode_hint(data); break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: break; } diff --git a/power-8994.c b/power-8994.c index f51b782..ccc025a 100644 --- a/power-8994.c +++ b/power-8994.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -128,6 +129,89 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_fling_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_BOOST_ON, + SCHED_PREFER_IDLE_DIS +}; + +static int resources_interaction_boost[] = { + ALL_CPUS_PWR_CLPS_DIS, + SCHED_PREFER_IDLE_DIS +}; + +static int resources_launch[] = { + SCHED_BOOST_ON, + 0x20C +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMinFlingDuration = 1500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + if (duration >= kMinFlingDuration) { + interaction(duration, ARRAY_SIZE(resources_interaction_fling_boost), + resources_interaction_fling_boost); + } else { + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); + } +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (!launch_mode) { + launch_handle = interaction_with_handle(launch_handle, kMaxLaunchDuration, + ARRAY_SIZE(resources_launch), resources_launch); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -137,6 +221,13 @@ int power_hint_override(power_hint_t hint, void* data) { case POWER_HINT_VIDEO_DECODE: ret_val = process_video_decode_hint(data); break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: break; } |