diff options
author | Ananth Raghavan Subramanian <sananth@codeaurora.org> | 2018-12-05 12:08:33 -0800 |
---|---|---|
committer | Ananth Raghavan Subramanian <sananth@codeaurora.org> | 2018-12-18 17:04:32 -0800 |
commit | 561cffcbfa66192e839e040d2da3bff2ecf8dcac (patch) | |
tree | 4615a13b2b1220364131a8db4f9efc34d4b51e1a | |
parent | 6192115442cac5bf8d8f67bbfa0b9d716b46ff07 (diff) | |
download | vendor_qcom_opensource_power-561cffcbfa66192e839e040d2da3bff2ecf8dcac.tar.gz vendor_qcom_opensource_power-561cffcbfa66192e839e040d2da3bff2ecf8dcac.tar.bz2 vendor_qcom_opensource_power-561cffcbfa66192e839e040d2da3bff2ecf8dcac.zip |
Clean up code and add generic hint handling
Removed unused code and added generic hint handling to power.c file,
does not need to be device specific anymore.
Change-Id: I0d4e2a73de0ce4d3735314d2e49ba58c23eb313c
-rw-r--r-- | hint-data.h | 9 | ||||
-rw-r--r-- | power.c | 358 | ||||
-rw-r--r-- | utils.c | 4 |
3 files changed, 33 insertions, 338 deletions
diff --git a/hint-data.h b/hint-data.h index 0cb54c2..48909c7 100644 --- a/hint-data.h +++ b/hint-data.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 2015, 2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2012, 2013, 2015, 2017-2018, 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 @@ -49,8 +49,15 @@ #define LAUNCH_HINT AOSP_DELTA + POWER_HINT_LAUNCH #define DISABLE_TOUCH_HINT AOSP_DELTA + POWER_HINT_DISABLE_TOUCH +//update NUM_HINTS if hints are added to AOSP +#define NUM_HINTS (POWER_HINT_DISABLE_TOUCH +1) + #define VR_MODE_SUSTAINED_PERF_HINT (0x1301) +struct hint_handles{ + int handle; + int ref_count; +}; struct hint_data { unsigned long hint_id; /* This is our key. */ @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018, 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 @@ -44,19 +44,11 @@ #include <hardware/power.h> #include "utils.h" -#include "metadata-defs.h" #include "hint-data.h" #include "performance.h" #include "power-common.h" -static int saved_dcvs_cpu0_slack_max = -1; -static int saved_dcvs_cpu0_slack_min = -1; -static int saved_mpdecision_slack_max = -1; -static int saved_mpdecision_slack_min = -1; -static int saved_interactive_mode = -1; -static int slack_node_rw_failed = 0; -static int display_hint_sent; -int display_boost; +static struct hint_handles handles[NUM_HINTS]; static int power_device_open(const hw_module_t* module, const char* name, hw_device_t** device); @@ -67,128 +59,11 @@ static struct hw_module_methods_t power_module_methods = { static void power_init(struct power_module *module) { - ALOGI("QTI power HAL initing."); + ALOGI("Initing"); - int fd; - char buf[10] = {0}; - - fd = open("/sys/devices/soc0/soc_id", O_RDONLY); - if (fd >= 0) { - if (read(fd, buf, sizeof(buf) - 1) == -1) { - ALOGW("Unable to read soc_id"); - } else { - int soc_id = atoi(buf); - if (soc_id == 194 || (soc_id >= 208 && soc_id <= 218) || soc_id == 178) { - display_boost = 1; - } - } - close(fd); - } -} - -static void process_video_decode_hint(void *metadata) -{ - char governor[80]; - struct video_decode_metadata_t video_decode_metadata; - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - - return; - } - - if (metadata) { - ALOGI("Processing video decode hint. Metadata: %s", (char *)metadata); - } - - /* 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 (metadata) { - if (parse_video_decode_metadata((char *)metadata, &video_decode_metadata) == - -1) { - ALOGE("Error occurred while parsing metadata."); - return; - } - } else { - return; - } - - if (video_decode_metadata.state == 1) { - if ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - int resource_values[] = {THREAD_MIGRATION_SYNC_OFF}; - - perform_hint_action(video_decode_metadata.hint_id, - resource_values, sizeof(resource_values)/sizeof(resource_values[0])); - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_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, sizeof(resource_values)/sizeof(resource_values[0])); - } - } else if (video_decode_metadata.state == 0) { - if ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { - undo_hint_action(video_decode_metadata.hint_id); - } - } -} - -static void process_video_encode_hint(void *metadata) -{ - char governor[80]; - struct video_encode_metadata_t video_encode_metadata; - - 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 ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - int resource_values[] = {IO_BUSY_OFF, SAMPLING_DOWN_FACTOR_1, THREAD_MIGRATION_SYNC_OFF}; - - perform_hint_action(video_encode_metadata.hint_id, - resource_values, sizeof(resource_values)/sizeof(resource_values[0])); - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_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, sizeof(resource_values)/sizeof(resource_values[0])); - } - } else if (video_encode_metadata.state == 0) { - if ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - undo_hint_action(video_encode_metadata.hint_id); - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { - undo_hint_action(video_encode_metadata.hint_id); - } + for (int i=0; i<NUM_HINTS; i++) { + handles[i].handle = 0; + handles[i].ref_count = 0; } } @@ -209,13 +84,9 @@ static void power_hint(struct power_module *module, power_hint_t hint, /* The power_hint has been handled. We can skip the rest. */ return; } - switch(hint) { case POWER_HINT_VSYNC: break; - case POWER_HINT_SUSTAINED_PERFORMANCE: - ALOGI("Sustained perf power hint not handled in power_hint_override"); - break; case POWER_HINT_VR_MODE: ALOGI("VR mode power hint not handled in power_hint_override"); break; @@ -227,11 +98,24 @@ static void power_hint(struct power_module *module, power_hint_t hint, interaction(duration, sizeof(resources)/sizeof(resources[0]), resources); } break; + //fall through below, hints will fail if not defined in powerhint.xml + case POWER_HINT_SUSTAINED_PERFORMANCE: case POWER_HINT_VIDEO_ENCODE: - process_video_encode_hint(data); - break; - case POWER_HINT_VIDEO_DECODE: - process_video_decode_hint(data); + if (data) { + if (handles[hint].ref_count == 0) + handles[hint].handle = perf_hint_enable((AOSP_DELTA + hint), 0); + + if (handles[hint].handle > 0) + handles[hint].ref_count++; + } + else + if (handles[hint].handle > 0) + if (--handles[hint].ref_count == 0) { + release_request(handles[hint].handle); + handles[hint].handle = 0; + } + else + ALOGE("Lock for hint: %X was not acquired, cannot be released", hint); break; } } @@ -243,11 +127,6 @@ int __attribute__ ((weak)) set_interactive_override(struct power_module *module, void set_interactive(struct power_module *module, int on) { - char governor[80]; - char tmp_str[NODE_MAX]; - struct video_encode_metadata_t video_encode_metadata; - int rc = 0; - if (!on) { /* Send Display OFF hint to perf HAL */ perf_hint_enable(VENDOR_HINT_DISPLAY_OFF, 0); @@ -261,197 +140,6 @@ void set_interactive(struct power_module *module, int on) } ALOGI("Got set_interactive hint"); - - if (get_scaling_governor(governor, sizeof(governor)) == -1) { - ALOGE("Can't obtain scaling governor."); - - return; - } - - if (!on) { - /* Display off. */ - if ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - int resource_values[] = {DISPLAY_OFF, MS_500, THREAD_MIGRATION_SYNC_OFF}; - - if (!display_hint_sent) { - perform_hint_action(DISPLAY_STATE_HINT_ID, - resource_values, sizeof(resource_values)/sizeof(resource_values[0])); - display_hint_sent = 1; - } - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { - int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF}; - - if (!display_hint_sent) { - perform_hint_action(DISPLAY_STATE_HINT_ID, - resource_values, sizeof(resource_values)/sizeof(resource_values[0])); - display_hint_sent = 1; - } - } else if ((strncmp(governor, MSMDCVS_GOVERNOR, strlen(MSMDCVS_GOVERNOR)) == 0) && - (strlen(governor) == strlen(MSMDCVS_GOVERNOR))) { - if (saved_interactive_mode == 1){ - /* Display turned off. */ - if (sysfs_read(DCVS_CPU0_SLACK_MAX_NODE, tmp_str, NODE_MAX - 1)) { - if (!slack_node_rw_failed) { - ALOGE("Failed to read from %s", DCVS_CPU0_SLACK_MAX_NODE); - } - - rc = 1; - } else { - saved_dcvs_cpu0_slack_max = atoi(tmp_str); - } - - if (sysfs_read(DCVS_CPU0_SLACK_MIN_NODE, tmp_str, NODE_MAX - 1)) { - if (!slack_node_rw_failed) { - ALOGE("Failed to read from %s", DCVS_CPU0_SLACK_MIN_NODE); - } - - rc = 1; - } else { - saved_dcvs_cpu0_slack_min = atoi(tmp_str); - } - - if (sysfs_read(MPDECISION_SLACK_MAX_NODE, tmp_str, NODE_MAX - 1)) { - if (!slack_node_rw_failed) { - ALOGE("Failed to read from %s", MPDECISION_SLACK_MAX_NODE); - } - - rc = 1; - } else { - saved_mpdecision_slack_max = atoi(tmp_str); - } - - if (sysfs_read(MPDECISION_SLACK_MIN_NODE, tmp_str, NODE_MAX - 1)) { - if(!slack_node_rw_failed) { - ALOGE("Failed to read from %s", MPDECISION_SLACK_MIN_NODE); - } - - rc = 1; - } else { - saved_mpdecision_slack_min = atoi(tmp_str); - } - - /* Write new values. */ - if (saved_dcvs_cpu0_slack_max != -1) { - snprintf(tmp_str, NODE_MAX, "%d", 10 * saved_dcvs_cpu0_slack_max); - - if (sysfs_write(DCVS_CPU0_SLACK_MAX_NODE, tmp_str) != 0) { - if (!slack_node_rw_failed) { - ALOGE("Failed to write to %s", DCVS_CPU0_SLACK_MAX_NODE); - } - - rc = 1; - } - } - - if (saved_dcvs_cpu0_slack_min != -1) { - snprintf(tmp_str, NODE_MAX, "%d", 10 * saved_dcvs_cpu0_slack_min); - - if (sysfs_write(DCVS_CPU0_SLACK_MIN_NODE, tmp_str) != 0) { - if(!slack_node_rw_failed) { - ALOGE("Failed to write to %s", DCVS_CPU0_SLACK_MIN_NODE); - } - - rc = 1; - } - } - - if (saved_mpdecision_slack_max != -1) { - snprintf(tmp_str, NODE_MAX, "%d", 10 * saved_mpdecision_slack_max); - - if (sysfs_write(MPDECISION_SLACK_MAX_NODE, tmp_str) != 0) { - if(!slack_node_rw_failed) { - ALOGE("Failed to write to %s", MPDECISION_SLACK_MAX_NODE); - } - - rc = 1; - } - } - - if (saved_mpdecision_slack_min != -1) { - snprintf(tmp_str, NODE_MAX, "%d", 10 * saved_mpdecision_slack_min); - - if (sysfs_write(MPDECISION_SLACK_MIN_NODE, tmp_str) != 0) { - if(!slack_node_rw_failed) { - ALOGE("Failed to write to %s", MPDECISION_SLACK_MIN_NODE); - } - - rc = 1; - } - } - } - - slack_node_rw_failed = rc; - } - } else { - /* Display on. */ - if ((strncmp(governor, ONDEMAND_GOVERNOR, strlen(ONDEMAND_GOVERNOR)) == 0) && - (strlen(governor) == strlen(ONDEMAND_GOVERNOR))) { - undo_hint_action(DISPLAY_STATE_HINT_ID); - display_hint_sent = 0; - } else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { - undo_hint_action(DISPLAY_STATE_HINT_ID); - display_hint_sent = 0; - } else if ((strncmp(governor, MSMDCVS_GOVERNOR, strlen(MSMDCVS_GOVERNOR)) == 0) && - (strlen(governor) == strlen(MSMDCVS_GOVERNOR))) { - if (saved_interactive_mode == -1 || saved_interactive_mode == 0) { - /* Display turned on. Restore if possible. */ - if (saved_dcvs_cpu0_slack_max != -1) { - snprintf(tmp_str, NODE_MAX, "%d", saved_dcvs_cpu0_slack_max); - - if (sysfs_write(DCVS_CPU0_SLACK_MAX_NODE, tmp_str) != 0) { - if (!slack_node_rw_failed) { - ALOGE("Failed to write to %s", DCVS_CPU0_SLACK_MAX_NODE); - } - - rc = 1; - } - } - - if (saved_dcvs_cpu0_slack_min != -1) { - snprintf(tmp_str, NODE_MAX, "%d", saved_dcvs_cpu0_slack_min); - - if (sysfs_write(DCVS_CPU0_SLACK_MIN_NODE, tmp_str) != 0) { - if (!slack_node_rw_failed) { - ALOGE("Failed to write to %s", DCVS_CPU0_SLACK_MIN_NODE); - } - - rc = 1; - } - } - - if (saved_mpdecision_slack_max != -1) { - snprintf(tmp_str, NODE_MAX, "%d", saved_mpdecision_slack_max); - - if (sysfs_write(MPDECISION_SLACK_MAX_NODE, tmp_str) != 0) { - if (!slack_node_rw_failed) { - ALOGE("Failed to write to %s", MPDECISION_SLACK_MAX_NODE); - } - - rc = 1; - } - } - - if (saved_mpdecision_slack_min != -1) { - snprintf(tmp_str, NODE_MAX, "%d", saved_mpdecision_slack_min); - - if (sysfs_write(MPDECISION_SLACK_MIN_NODE, tmp_str) != 0) { - if (!slack_node_rw_failed) { - ALOGE("Failed to write to %s", MPDECISION_SLACK_MIN_NODE); - } - - rc = 1; - } - } - } - - slack_node_rw_failed = rc; - } - } - - saved_interactive_mode = !!on; } static int power_device_open(const hw_module_t* module, const char* name, @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013,2015-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2013,2015-2018, 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 @@ -255,7 +255,7 @@ int perf_hint_enable(int hint_id , int duration) if (perf_hint) { lock_handle = perf_hint(hint_id, NULL, duration, -1); if (lock_handle == -1) - ALOGE("Failed to acquire lock."); + ALOGE("Failed to acquire lock for hint_id: %X.", hint_id); } } return lock_handle; |