summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnanth Raghavan Subramanian <sananth@codeaurora.org>2018-12-05 12:08:33 -0800
committerAnanth Raghavan Subramanian <sananth@codeaurora.org>2018-12-18 17:04:32 -0800
commit561cffcbfa66192e839e040d2da3bff2ecf8dcac (patch)
tree4615a13b2b1220364131a8db4f9efc34d4b51e1a
parent6192115442cac5bf8d8f67bbfa0b9d716b46ff07 (diff)
downloadvendor_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.h9
-rw-r--r--power.c358
-rw-r--r--utils.c4
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. */
diff --git a/power.c b/power.c
index 051cd5a..2206fa9 100644
--- a/power.c
+++ b/power.c
@@ -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,
diff --git a/utils.c b/utils.c
index cf8c360..66c45e0 100644
--- a/utils.c
+++ b/utils.c
@@ -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;