diff options
author | Zhao Wei Liew <zhaoweiliew@gmail.com> | 2015-11-17 17:45:03 +0800 |
---|---|---|
committer | Arne Coucheron <arco68@gmail.com> | 2018-12-12 21:20:40 +0100 |
commit | fbb8521fd1b55395791c6f8ce35e417f40939f79 (patch) | |
tree | a2dda3ca04e9235789c1b86dde4e87722ec7f859 | |
parent | 1a2785e9c7f0ad8882c1f0af45e43b28045fe35e (diff) | |
download | android_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.mk | 4 | ||||
-rw-r--r-- | power-8960.c | 153 |
2 files changed, 157 insertions, 0 deletions
@@ -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; +} |