diff options
-rw-r--r-- | Android.mk | 4 | ||||
-rw-r--r-- | power-660.c | 156 | ||||
-rw-r--r-- | power-8084.c | 91 | ||||
-rw-r--r-- | power-8226.c | 93 | ||||
-rw-r--r-- | power-845.c | 3 | ||||
-rw-r--r-- | power-8610.c | 93 | ||||
-rw-r--r-- | power-8909.c | 74 | ||||
-rw-r--r-- | power-8916.c | 2 | ||||
-rw-r--r-- | power-8937.c | 177 | ||||
-rw-r--r-- | power-8952.c | 181 | ||||
-rw-r--r-- | power-8953.c | 175 | ||||
-rw-r--r-- | power-8960.c | 140 | ||||
-rw-r--r-- | power-8974.c | 91 | ||||
-rw-r--r-- | power-8992.c | 53 | ||||
-rw-r--r-- | power-8994.c | 53 | ||||
-rw-r--r-- | power-8996.c | 27 | ||||
-rw-r--r-- | power-8998.c | 2 |
17 files changed, 986 insertions, 429 deletions
@@ -36,6 +36,10 @@ ifneq ($(BOARD_POWER_CUSTOM_BOARD_LIB),) else # Include target-specific files. +ifeq ($(call is-board-platform-in-list,msm8960), true) +LOCAL_SRC_FILES += power-8960.c +endif + ifeq ($(call is-board-platform-in-list,msm8974), true) LOCAL_SRC_FILES += power-8974.c endif diff --git a/power-660.c b/power-660.c index 00d50c5..23a91b6 100644 --- a/power-660.c +++ b/power-660.c @@ -53,8 +53,6 @@ static int video_encode_hint_sent; -static void process_video_encode_hint(void* metadata); - /** * Returns true if the target is SDM630/SDM455. */ @@ -70,18 +68,87 @@ static bool is_target_SDM630(void) { return is_SDM630; } +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + if (is_target_SDM630()) { + /* + 1. CPUfreq params + - hispeed freq for big - 1113Mhz + - go hispeed load for big - 95 + - above_hispeed_delay for big - 40ms + - target loads - 95 + - nr_run - 5 + 2. BusDCVS V2 params + - Sample_ms of 10ms + */ + int resource_values[] = {0x41414000, 0x459, 0x41410000, 0x5F, 0x41400000, 0x4, + 0x41420000, 0x5F, 0x40C2C000, 0X5, 0x41820000, 0xA}; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } else { + /* + 1. CPUfreq params + - hispeed freq for little - 902Mhz + - go hispeed load for little - 95 + - above_hispeed_delay for little - 40ms + 2. BusDCVS V2 params + - Sample_ms of 10ms + */ + int resource_values[] = {0x41414100, 0x386, 0x41410100, 0x5F, + 0x41400100, 0x4, 0x41820000, 0xA}; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + video_encode_hint_sent = 0; + return HINT_HANDLED; + } + } + return HINT_NONE; +} + int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_VSYNC: + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); break; - case POWER_HINT_VIDEO_ENCODE: { - process_video_encode_hint(data); - return HINT_HANDLED; - } default: break; } - return HINT_NONE; + return ret_val; } int set_interactive_override(int on) { @@ -138,76 +205,3 @@ int set_interactive_override(int on) { } return HINT_HANDLED; } - -/* Video Encode Hint */ -static void process_video_encode_hint(void* metadata) { - char governor[80]; - int resource_values[20]; - int num_resources; - struct video_encode_metadata_t video_encode_metadata; - - ALOGI("Got process_video_encode_hint"); - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - // return HINT_HANDLED; - } - - /* Initialize encode metadata struct fields. */ - memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); - video_encode_metadata.state = -1; - video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; - } - - if (video_encode_metadata.state == 1) { - if (is_interactive_governor(governor)) { - /* - 1. CPUfreq params - - hispeed freq for big - 1113Mhz - - go hispeed load for big - 95 - - above_hispeed_delay for big - 40ms - - target loads - 95 - - nr_run - 5 - 2. BusDCVS V2 params - - Sample_ms of 10ms - */ - if (is_target_SDM630()) { - int res[] = {0x41414000, 0x459, 0x41410000, 0x5F, 0x41400000, 0x4, - 0x41420000, 0x5F, 0x40C2C000, 0X5, 0x41820000, 0xA}; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - num_resources = ARRAY_SIZE(res); - } - /* - 1. CPUfreq params - - hispeed freq for little - 902Mhz - - go hispeed load for little - 95 - - above_hispeed_delay for little - 40ms - 2. BusDCVS V2 params - - Sample_ms of 10ms - */ - else { - int res[] = {0x41414100, 0x386, 0x41410100, 0x5F, 0x41400100, 0x4, 0x41820000, 0xA}; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - num_resources = ARRAY_SIZE(res); - } - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, num_resources); - video_encode_hint_sent = 1; - } - } - } else if (video_encode_metadata.state == 0) { - if (is_interactive_governor(governor)) { - undo_hint_action(video_encode_metadata.hint_id); - video_encode_hint_sent = 0; - } - } - return; -} diff --git a/power-8084.c b/power-8084.c index 2fd49ab..73176c1 100644 --- a/power-8084.c +++ b/power-8084.c @@ -49,6 +49,97 @@ static int first_display_off_hint; +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF, INTERACTIVE_IO_BUSY_OFF}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + default: + break; + } + return ret_val; +} + int set_interactive_override(int on) { char governor[80]; diff --git a/power-8226.c b/power-8226.c index a53cc72..01c481d 100644 --- a/power-8226.c +++ b/power-8226.c @@ -47,17 +47,100 @@ #include "power-common.h" #include "utils.h" -int power_hint_override(power_hint_t hint, void* UNUSED(data)) { +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF, INTERACTIVE_IO_BUSY_OFF}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_INTERACTION: { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + case POWER_HINT_INTERACTION: int resources[] = {0x702, 0x20B, 0x30B}; int duration = 3000; interaction(duration, ARRAY_SIZE(resources), resources); - return HINT_HANDLED; - } + ret_val = HINT_HANDLED; + break; default: break; } - return HINT_NONE; + return ret_val; } diff --git a/power-845.c b/power-845.c index 3c464d9..aaf355b 100644 --- a/power-845.c +++ b/power-845.c @@ -154,7 +154,6 @@ static int process_video_encode_hint(void* metadata) { if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - return HINT_NONE; } @@ -170,13 +169,11 @@ static int process_video_encode_hint(void* metadata) { if (video_encode_metadata.state == 1) { if (is_interactive_governor(governor)) { video_encode_handle = perf_hint_enable(VIDEO_ENCODE_HINT, 0); - ALOGI("Video encode hint start"); return HINT_HANDLED; } } else if (video_encode_metadata.state == 0) { if (is_interactive_governor(governor)) { release_request(video_encode_handle); - ALOGI("Video Encode hint stop"); return HINT_HANDLED; } } diff --git a/power-8610.c b/power-8610.c index a53cc72..01c481d 100644 --- a/power-8610.c +++ b/power-8610.c @@ -47,17 +47,100 @@ #include "power-common.h" #include "utils.h" -int power_hint_override(power_hint_t hint, void* UNUSED(data)) { +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF, INTERACTIVE_IO_BUSY_OFF}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_INTERACTION: { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + case POWER_HINT_INTERACTION: int resources[] = {0x702, 0x20B, 0x30B}; int duration = 3000; interaction(duration, ARRAY_SIZE(resources), resources); - return HINT_HANDLED; - } + ret_val = HINT_HANDLED; + break; default: break; } - return HINT_NONE; + return ret_val; } diff --git a/power-8909.c b/power-8909.c index 47dc814..38d0e1c 100644 --- a/power-8909.c +++ b/power-8909.c @@ -47,28 +47,25 @@ #include "power-common.h" #include "utils.h" -static void process_video_encode_hint(void* metadata) { +static int process_video_encode_hint(void* metadata) { char governor[80]; struct video_encode_metadata_t video_encode_metadata; + if (!metadata) return HINT_NONE; + if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - - return; + return HINT_NONE; } - /* Initialize encode metadata struct fields. */ + /* Initialize encode metadata struct fields */ memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); video_encode_metadata.state = -1; video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; } if (video_encode_metadata.state == 1) { @@ -76,21 +73,66 @@ static void process_video_encode_hint(void* metadata) { int resource_values[] = {HS_FREQ_800, THREAD_MIGRATION_SYNC_OFF}; perform_hint_action(video_encode_metadata.hint_id, resource_values, ARRAY_SIZE(resource_values)); + return HINT_HANDLED; } } else if (video_encode_metadata.state == 0) { if (is_interactive_governor(governor)) { undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; } } + return HINT_NONE; } -int power_hint_override(power_hint_t hint, void* data) { - switch (hint) { - case POWER_HINT_VIDEO_ENCODE: { - process_video_encode_hint(data); +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); return HINT_HANDLED; } - default: { break; } } return HINT_NONE; } + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + default: + break; + } + return ret_val; +} diff --git a/power-8916.c b/power-8916.c index af32609..422cb75 100644 --- a/power-8916.c +++ b/power-8916.c @@ -84,8 +84,6 @@ int power_hint_override(power_hint_t hint, void* UNUSED(data)) { } case POWER_HINT_VIDEO_ENCODE: /* Do nothing for encode case */ return HINT_HANDLED; - case POWER_HINT_VIDEO_DECODE: /* Do nothing for decode case */ - return HINT_HANDLED; default: return HINT_HANDLED; } diff --git a/power-8937.c b/power-8937.c index 2cbdc71..98431d3 100644 --- a/power-8937.c +++ b/power-8937.c @@ -49,10 +49,8 @@ #include "power-common.h" #include "utils.h" -#define MIN_VAL(X, Y) ((X > Y) ? (Y) : (X)) - static int video_encode_hint_sent; -static void process_video_encode_hint(void* metadata); + static int display_fd; #define SYS_DISPLAY_PWR "/sys/kernel/hbtp/display_pwr" @@ -71,18 +69,97 @@ static bool is_target_SDM439(void) { return is_SDM439; } +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_schedutil_governor(governor)) { + if (is_target_SDM439()) { + /* sample_ms = 10mS + * SLB for Core0 = -6 + * SLB for Core1 = -6 + * SLB for Core2 = -6 + * SLB for Core3 = -6 + * hispeed load = 95 + * hispeed freq = 998Mhz */ + int resource_values[] = { + 0x41820000, 0xa, 0x40c68100, 0xfffffffa, 0x40c68110, + 0xfffffffa, 0x40c68120, 0xfffffffa, 0x40c68130, 0xfffffffa, + 0x41440100, 0x5f, 0x4143c100, 0x3e6, + }; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } else { + /* sample_ms = 10mS */ + int resource_values[] = { + 0x41820000, + 0xa, + }; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } + } else if (is_interactive_governor(governor)) { + /* Sched_load and migration_notification disable + * timer rate - 40mS*/ + int resource_values[] = {INT_OP_CLUSTER0_USE_SCHED_LOAD, 0x1, + INT_OP_CLUSTER1_USE_SCHED_LOAD, 0x1, + INT_OP_CLUSTER0_USE_MIGRATION_NOTIF, 0x1, + INT_OP_CLUSTER1_USE_MIGRATION_NOTIF, 0x1, + INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_40, + INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_40}; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor) || is_schedutil_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + video_encode_hint_sent = 0; + return HINT_HANDLED; + } + } + return HINT_NONE; +} + int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_VSYNC: + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); break; - case POWER_HINT_VIDEO_ENCODE: { - process_video_encode_hint(data); - return HINT_HANDLED; - } default: break; } - return HINT_NONE; + return ret_val; } int set_interactive_override(int on) { @@ -150,85 +227,3 @@ int set_interactive_override(int on) { return HINT_HANDLED; } - -/* Video Encode Hint */ -static void process_video_encode_hint(void* metadata) { - char governor[80] = {0}; - int resource_values[20] = {0}; - struct video_encode_metadata_t video_encode_metadata; - - ALOGI("Got process_video_encode_hint"); - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - return; - } - - /* Initialize encode metadata struct fields. */ - memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); - video_encode_metadata.state = -1; - video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; - } - - if (video_encode_metadata.state == 1) { - if (is_schedutil_governor(governor)) { - if (is_target_SDM439()) { - /* sample_ms = 10mS - * SLB for Core0 = -6 - * SLB for Core1 = -6 - * SLB for Core2 = -6 - * SLB for Core3 = -6 - * hispeed load = 95 - * hispeed freq = 998Mhz */ - int res[] = { - 0x41820000, 0xa, 0x40c68100, 0xfffffffa, 0x40c68110, - 0xfffffffa, 0x40c68120, 0xfffffffa, 0x40c68130, 0xfffffffa, - 0x41440100, 0x5f, 0x4143c100, 0x3e6, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } else { - /* sample_ms = 10mS */ - int res[] = { - 0x41820000, - 0xa, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } - } else if (is_interactive_governor(governor)) { - /* Sched_load and migration_notif*/ - int res[] = {INT_OP_CLUSTER0_USE_SCHED_LOAD, 0x1, - INT_OP_CLUSTER1_USE_SCHED_LOAD, 0x1, - INT_OP_CLUSTER0_USE_MIGRATION_NOTIF, 0x1, - INT_OP_CLUSTER1_USE_MIGRATION_NOTIF, 0x1, - INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_40, - INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_40}; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - perform_hint_action(video_encode_metadata.hint_id, resource_values, ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } else if (video_encode_metadata.state == 0) { - if (is_interactive_governor(governor) || is_schedutil_governor(governor)) { - undo_hint_action(video_encode_metadata.hint_id); - video_encode_hint_sent = 0; - } - } - return; -} diff --git a/power-8952.c b/power-8952.c index a11d809..2b320d0 100644 --- a/power-8952.c +++ b/power-8952.c @@ -49,38 +49,99 @@ #include "power-common.h" #include "utils.h" -#define MIN_VAL(X, Y) ((X > Y) ? (Y) : (X)) +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; -static int video_encode_hint_sent; -static void process_video_encode_hint(void* metadata); + if (!metadata) return HINT_NONE; -/** - * Returns true if the target is SDM439/SDM429. - */ -static bool is_target_SDM439(void) { - static int is_SDM439 = -1; - int soc_id; + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } - if (is_SDM439 >= 0) return is_SDM439; + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - soc_id = get_soc_id(); - is_SDM439 = soc_id == 353 || soc_id == 363 || soc_id == 354 || soc_id == 364; + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } - return is_SDM439; + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {INT_OP_CLUSTER0_USE_SCHED_LOAD, 0x1, + INT_OP_CLUSTER1_USE_SCHED_LOAD, 0x1, + INT_OP_CLUSTER0_USE_MIGRATION_NOTIF, 0x1, + INT_OP_CLUSTER1_USE_MIGRATION_NOTIF, 0x1, + INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_40, + INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_40}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; } int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_VSYNC: + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); break; - case POWER_HINT_VIDEO_ENCODE: { - process_video_encode_hint(data); - return HINT_HANDLED; - } default: break; } - return HINT_NONE; + return ret_val; } int set_interactive_override(int on) { @@ -112,85 +173,3 @@ int set_interactive_override(int on) { } return HINT_HANDLED; } - -/* Video Encode Hint */ -static void process_video_encode_hint(void* metadata) { - char governor[80] = {0}; - int resource_values[20] = {0}; - struct video_encode_metadata_t video_encode_metadata; - - ALOGI("Got process_video_encode_hint"); - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - return; - } - - /* Initialize encode metadata struct fields. */ - memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); - video_encode_metadata.state = -1; - video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; - } - - if (video_encode_metadata.state == 1) { - if (is_schedutil_governor(governor)) { - if (is_target_SDM439()) { - /* sample_ms = 10mS - * SLB for Core0 = -6 - * SLB for Core1 = -6 - * SLB for Core2 = -6 - * SLB for Core3 = -6 - * hispeed load = 95 - * hispeed freq = 998Mhz */ - int res[] = { - 0x41820000, 0xa, 0x40c68100, 0xfffffffa, 0x40c68110, - 0xfffffffa, 0x40c68120, 0xfffffffa, 0x40c68130, 0xfffffffa, - 0x41440100, 0x5f, 0x4143c100, 0x3e6, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } else { - /* sample_ms = 10mS */ - int res[] = { - 0x41820000, - 0xa, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } - } else if (is_interactive_governor(governor)) { - /* Sched_load and migration_notif*/ - int res[] = {INT_OP_CLUSTER0_USE_SCHED_LOAD, 0x1, - INT_OP_CLUSTER1_USE_SCHED_LOAD, 0x1, - INT_OP_CLUSTER0_USE_MIGRATION_NOTIF, 0x1, - INT_OP_CLUSTER1_USE_MIGRATION_NOTIF, 0x1, - INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_40, - INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_40}; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - perform_hint_action(video_encode_metadata.hint_id, resource_values, ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } else if (video_encode_metadata.state == 0) { - if (is_interactive_governor(governor) || is_schedutil_governor(governor)) { - undo_hint_action(video_encode_metadata.hint_id); - video_encode_hint_sent = 0; - } - } - return; -} diff --git a/power-8953.c b/power-8953.c index 76569b5..a151180 100644 --- a/power-8953.c +++ b/power-8953.c @@ -49,12 +49,8 @@ #include "power-common.h" #include "utils.h" -#define MIN_VAL(X, Y) ((X > Y) ? (Y) : (X)) - static int video_encode_hint_sent; -static void process_video_encode_hint(void* metadata); - static int display_fd; #define SYS_DISPLAY_PWR "/sys/kernel/hbtp/display_pwr" @@ -73,18 +69,94 @@ static bool is_target_SDM632(void) { return is_SDM632; } +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_schedutil_governor(governor)) { + if (is_target_SDM632()) { + /* sample_ms = 10mS + * SLB for Core0 = -6 + * SLB for Core1 = -6 + * SLB for Core2 = -6 + * SLB for Core3 = -6 + * hispeed load = 95 + * hispeed freq = 1036 */ + int resource_values[] = { + 0x41820000, 0xa, 0x40c68100, 0xfffffffa, 0x40c68110, + 0xfffffffa, 0x40c68120, 0xfffffffa, 0x40c68130, 0xfffffffa, + 0x41440100, 0x5f, 0x4143c100, 0x40c, + }; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } else { + /* sample_ms = 10mS */ + int resource_values[] = { + 0x41820000, + 0xa, + }; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } + } else if (is_interactive_governor(governor)) { + /* Sched_load and migration_notification disable + * timer rate - 40mS*/ + int resource_values[] = { + 0x41430000, 0x1, 0x41434000, 0x1, 0x41424000, 0x28, + }; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor) || is_schedutil_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + video_encode_hint_sent = 0; + return HINT_HANDLED; + } + } + return HINT_NONE; +} + int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; switch (hint) { - case POWER_HINT_VSYNC: + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); break; - case POWER_HINT_VIDEO_ENCODE: { - process_video_encode_hint(data); - return HINT_HANDLED; - } default: break; } - return HINT_NONE; + return ret_val; } int set_interactive_override(int on) { @@ -153,86 +225,3 @@ int set_interactive_override(int on) { return HINT_HANDLED; } - -/* Video Encode Hint */ -static void process_video_encode_hint(void* metadata) { - char governor[80] = {0}; - int resource_values[20] = {0}; - struct video_encode_metadata_t video_encode_metadata; - - ALOGI("Got process_video_encode_hint"); - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - // return HINT_HANDLED; - } - - /* Initialize encode metadata struct fields. */ - memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); - video_encode_metadata.state = -1; - video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; - } - - if (video_encode_metadata.state == 1) { - if (is_schedutil_governor(governor)) { - if (is_target_SDM632()) { - /* sample_ms = 10mS - * SLB for Core0 = -6 - * SLB for Core1 = -6 - * SLB for Core2 = -6 - * SLB for Core3 = -6 - * hispeed load = 95 - * hispeed freq = 1036 */ - int res[] = { - 0x41820000, 0xa, 0x40c68100, 0xfffffffa, 0x40c68110, - 0xfffffffa, 0x40c68120, 0xfffffffa, 0x40c68130, 0xfffffffa, - 0x41440100, 0x5f, 0x4143c100, 0x40c, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } else { - /* sample_ms = 10mS */ - int res[] = { - 0x41820000, - 0xa, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } - } else if (is_interactive_governor(governor)) { - /* Sched_load and migration_notification disable - * timer rate - 40mS*/ - int res[] = { - 0x41430000, 0x1, 0x41434000, 0x1, 0x41424000, 0x28, - }; - memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); - if (!video_encode_hint_sent) { - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(res)); - video_encode_hint_sent = 1; - } - } - } else if (video_encode_metadata.state == 0) { - if (is_interactive_governor(governor) || is_schedutil_governor(governor)) { - undo_hint_action(video_encode_metadata.hint_id); - video_encode_hint_sent = 0; - } - } - return; -} diff --git a/power-8960.c b/power-8960.c new file mode 100644 index 0000000..0c5809b --- /dev/null +++ b/power-8960.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_NIDEBUG 0 + +#include <dlfcn.h> +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> + +#define LOG_TAG "QCOM PowerHAL" +#include <hardware/hardware.h> +#include <hardware/power.h> +#include <log/log.h> + +#include "hint-data.h" +#include "metadata-defs.h" +#include "performance.h" +#include "power-common.h" +#include "utils.h" + +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF, INTERACTIVE_IO_BUSY_OFF}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + default: + break; + } + return ret_val; +} diff --git a/power-8974.c b/power-8974.c index 226ee74..029c933 100644 --- a/power-8974.c +++ b/power-8974.c @@ -64,6 +64,97 @@ static bool is_target_8974pro(void) { return is_8974pro; } +static int process_video_encode_hint(void* metadata) { + char governor[80]; + struct video_encode_metadata_t video_encode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize encode metadata struct fields */ + memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); + video_encode_metadata.state = -1; + video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; + + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_encode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF, INTERACTIVE_IO_BUSY_OFF}; + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_encode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_encode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + +int power_hint_override(power_hint_t hint, void* data) { + int ret_val = HINT_NONE; + switch (hint) { + case POWER_HINT_VIDEO_ENCODE: + ret_val = process_video_encode_hint(data); + break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; + default: + break; + } + return ret_val; +} + int set_interactive_override(int on) { char governor[80]; diff --git a/power-8992.c b/power-8992.c index e914d7f..541cc0b 100644 --- a/power-8992.c +++ b/power-8992.c @@ -51,9 +51,10 @@ static int process_video_encode_hint(void* metadata) { char governor[80]; struct video_encode_metadata_t video_encode_metadata; + if (!metadata) return HINT_NONE; + if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - return HINT_NONE; } @@ -62,12 +63,8 @@ static int process_video_encode_hint(void* metadata) { video_encode_metadata.state = -1; video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return HINT_NONE; - } - } else { + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); return HINT_NONE; } @@ -80,7 +77,6 @@ static int process_video_encode_hint(void* metadata) { * sched_small_tsk - 50 */ int resource_values[] = {0x2C07, 0x2F5A, 0x2704, 0x4032}; - perform_hint_action(video_encode_metadata.hint_id, resource_values, ARRAY_SIZE(resource_values)); return HINT_HANDLED; @@ -94,12 +90,53 @@ static int process_video_encode_hint(void* metadata) { return HINT_NONE; } +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { case POWER_HINT_VIDEO_ENCODE: ret_val = process_video_encode_hint(data); break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; default: break; } diff --git a/power-8994.c b/power-8994.c index 84737ff..561809e 100644 --- a/power-8994.c +++ b/power-8994.c @@ -51,9 +51,10 @@ static int process_video_encode_hint(void* metadata) { char governor[80]; struct video_encode_metadata_t video_encode_metadata; + if (!metadata) return HINT_NONE; + if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - return HINT_NONE; } @@ -62,12 +63,8 @@ static int process_video_encode_hint(void* metadata) { video_encode_metadata.state = -1; video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return HINT_NONE; - } - } else { + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); return HINT_NONE; } @@ -80,7 +77,6 @@ static int process_video_encode_hint(void* metadata) { * sched_small_tsk - 50 */ int resource_values[] = {0x2C07, 0x2F5A, 0x2704, 0x4032}; - perform_hint_action(video_encode_metadata.hint_id, resource_values, ARRAY_SIZE(resource_values)); return HINT_HANDLED; @@ -94,12 +90,53 @@ static int process_video_encode_hint(void* metadata) { return HINT_NONE; } +static int process_video_decode_hint(void* metadata) { + char governor[80]; + struct video_decode_metadata_t video_decode_metadata; + + if (!metadata) return HINT_NONE; + + if (get_scaling_governor(governor, sizeof(governor)) == -1) { + ALOGE("Can't obtain scaling governor."); + return HINT_NONE; + } + + /* Initialize decode metadata struct fields */ + memset(&video_decode_metadata, 0, sizeof(struct video_decode_metadata_t)); + video_decode_metadata.state = -1; + video_decode_metadata.hint_id = DEFAULT_VIDEO_DECODE_HINT_ID; + + if (parse_video_decode_metadata((char*)metadata, &video_decode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); + return HINT_NONE; + } + + if (video_decode_metadata.state == 1) { + if (is_interactive_governor(governor)) { + int resource_values[] = {TR_MS_30, HISPEED_LOAD_90, HS_FREQ_1026, + THREAD_MIGRATION_SYNC_OFF}; + perform_hint_action(video_decode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + return HINT_HANDLED; + } + } else if (video_decode_metadata.state == 0) { + if (is_interactive_governor(governor)) { + undo_hint_action(video_decode_metadata.hint_id); + return HINT_HANDLED; + } + } + return HINT_NONE; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { case POWER_HINT_VIDEO_ENCODE: ret_val = process_video_encode_hint(data); break; + case POWER_HINT_VIDEO_DECODE: + ret_val = process_video_decode_hint(data); + break; default: break; } diff --git a/power-8996.c b/power-8996.c index 9269149..49f5932 100644 --- a/power-8996.c +++ b/power-8996.c @@ -47,13 +47,16 @@ #include "power-common.h" #include "utils.h" +static int video_encode_hint_sent; + static int process_video_encode_hint(void* metadata) { char governor[80]; struct video_encode_metadata_t video_encode_metadata; + if (!metadata) return HINT_NONE; + if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - return HINT_NONE; } @@ -62,12 +65,8 @@ static int process_video_encode_hint(void* metadata) { video_encode_metadata.state = -1; video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; - if (metadata) { - if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { - ALOGE("Error occurred while parsing metadata."); - return HINT_NONE; - } - } else { + if (parse_video_encode_metadata((char*)metadata, &video_encode_metadata) == -1) { + ALOGE("Error occurred while parsing metadata."); return HINT_NONE; } @@ -94,17 +93,17 @@ static int process_video_encode_hint(void* metadata) { 0x41420000, 0x5A, 0x41400100, 0x4, 0x41410100, 0x5F, 0x41414100, 0x22C, 0x41420100, 0x5A, 0x41810000, 0x9C4, 0x41814000, 0x32, 0x4180C000, 0x0, 0x41820000, 0xA}; - - perform_hint_action(video_encode_metadata.hint_id, resource_values, - ARRAY_SIZE(resource_values)); - ALOGI("Video Encode hint start"); - return HINT_HANDLED; + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, resource_values, + ARRAY_SIZE(resource_values)); + video_encode_hint_sent = 1; + return HINT_HANDLED; + } } } else if (video_encode_metadata.state == 0) { if (is_interactive_governor(governor)) { undo_hint_action(video_encode_metadata.hint_id); - - ALOGI("Video Encode hint stop"); + video_encode_hint_sent = 0; return HINT_HANDLED; } } diff --git a/power-8998.c b/power-8998.c index e786f5c..7fcc347 100644 --- a/power-8998.c +++ b/power-8998.c @@ -150,7 +150,6 @@ static int process_video_encode_hint(void* metadata) { if (get_scaling_governor(governor, sizeof(governor)) == -1) { ALOGE("Can't obtain scaling governor."); - return HINT_NONE; } @@ -171,7 +170,6 @@ static int process_video_encode_hint(void* metadata) { } else if (video_encode_metadata.state == 0) { if (is_interactive_governor(governor)) { release_request(video_encode_handle); - ALOGI("Video Encode hint stop"); return HINT_HANDLED; } } |