diff options
Diffstat (limited to 'power-8952.c')
-rw-r--r-- | power-8952.c | 181 |
1 files changed, 80 insertions, 101 deletions
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; -} |