summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--power-8084.c102
-rw-r--r--power-8226.c46
-rw-r--r--power-8610.c46
-rw-r--r--power-8916.c116
-rw-r--r--power-8974.c99
-rw-r--r--power-8992.c91
-rw-r--r--power-8994.c91
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;
}