summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhao Wei Liew <zhaoweiliew@gmail.com>2015-11-17 17:45:03 +0800
committerArne Coucheron <arco68@gmail.com>2018-12-12 21:20:40 +0100
commitfbb8521fd1b55395791c6f8ce35e417f40939f79 (patch)
treea2dda3ca04e9235789c1b86dde4e87722ec7f859
parent1a2785e9c7f0ad8882c1f0af45e43b28045fe35e (diff)
downloadandroid_hardware_qcom_power-fbb8521fd1b55395791c6f8ce35e417f40939f79.tar.gz
android_hardware_qcom_power-fbb8521fd1b55395791c6f8ce35e417f40939f79.tar.bz2
android_hardware_qcom_power-fbb8521fd1b55395791c6f8ce35e417f40939f79.zip
power: msm8960: Implement performance profiles
* Based on legacy HAL implementation Change-Id: Id7d16f97c177a790427d848e8ccea3286cf37a4e
-rw-r--r--Android.mk4
-rw-r--r--power-8960.c153
2 files changed, 157 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk
index e91901f..157cd65 100644
--- a/Android.mk
+++ b/Android.mk
@@ -52,6 +52,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-8960.c b/power-8960.c
new file mode 100644
index 0000000..495e196
--- /dev/null
+++ b/power-8960.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (C) 2018 The LineageOS Project
+ *
+ * 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 <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#define LOG_TAG "QCOM PowerHAL"
+#include <log/log.h>
+#include <hardware/hardware.h>
+#include <hardware/power.h>
+
+#include "utils.h"
+#include "metadata-defs.h"
+#include "hint-data.h"
+#include "performance.h"
+#include "power-common.h"
+
+/**
+ * Returns true if the target is APQ8064.
+ */
+static bool is_target_8064(void)
+{
+ static int is_8064 = -1;
+ int soc_id;
+
+ if (is_8064 >= 0)
+ return is_8064;
+
+ soc_id = get_soc_id();
+ is_8064 = soc_id == 153;
+
+ return is_8064;
+}
+
+static int current_power_profile = PROFILE_BALANCED;
+
+static int profile_high_performance_8960[] = {
+ CPUS_ONLINE_MIN_2,
+};
+
+static int profile_high_performance_8064[] = {
+ CPUS_ONLINE_MIN_4,
+};
+
+static int profile_power_save_8960[] = {
+ /* Don't do anything for now */
+};
+
+static int profile_power_save_8064[] = {
+ CPUS_ONLINE_MAX_LIMIT_2,
+};
+
+#ifdef INTERACTION_BOOST
+int get_number_of_profiles()
+{
+ return 3;
+}
+#endif
+
+static int set_power_profile(int profile)
+{
+ int ret = -EINVAL;
+ const char *profile_name = NULL;
+
+ if (profile == current_power_profile)
+ return 0;
+
+ ALOGV("%s: Profile=%d", __func__, profile);
+
+ if (current_power_profile != PROFILE_BALANCED) {
+ undo_hint_action(DEFAULT_PROFILE_HINT_ID);
+ ALOGV("%s: Hint undone", __func__);
+ current_power_profile = PROFILE_BALANCED;
+ }
+
+ if (profile == PROFILE_POWER_SAVE) {
+ int* resource_values = is_target_8064() ?
+ profile_power_save_8064 : profile_power_save_8960;
+
+ ret = perform_hint_action(DEFAULT_PROFILE_HINT_ID,
+ resource_values, ARRAY_SIZE(resource_values));
+ profile_name = "powersave";
+
+ } else if (profile == PROFILE_HIGH_PERFORMANCE) {
+ int *resource_values = is_target_8064() ?
+ profile_high_performance_8064 : profile_high_performance_8960;
+
+ ret = perform_hint_action(DEFAULT_PROFILE_HINT_ID,
+ resource_values, ARRAY_SIZE(resource_values));
+ profile_name = "performance";
+
+ } else if (profile == PROFILE_BALANCED) {
+ ret = 0;
+ profile_name = "balanced";
+ }
+
+ if (ret == 0) {
+ current_power_profile = profile;
+ ALOGD("%s: Set %s mode", __func__, profile_name);
+ }
+ return ret;
+}
+
+int power_hint_override(power_hint_t hint, void *data)
+{
+ if (hint == POWER_HINT_SET_PROFILE) {
+ if (set_power_profile(*(int32_t *)data) < 0)
+ ALOGE("Setting power profile failed. perfd not started?");
+ return HINT_HANDLED;
+ }
+
+ // Skip other hints in high/low power modes
+ if (current_power_profile == PROFILE_POWER_SAVE ||
+ current_power_profile == PROFILE_HIGH_PERFORMANCE) {
+ return HINT_HANDLED;
+ }
+
+ return HINT_NONE;
+}