diff options
author | Deevana Murthy Bandaru <dbandaru@codeaurora.org> | 2018-08-20 14:48:35 +0530 |
---|---|---|
committer | Deevana Murthy Bandaru <dbandaru@codeaurora.org> | 2018-08-20 16:51:52 +0530 |
commit | 48bb283d4bb4448bbeaa34182f30bd78f77a3f71 (patch) | |
tree | e709f879939d1c9b741594a0fa95b1a6706a284f /power-8953.c | |
parent | 9ff55b3b4c0fe8d1711f48cf403ce0058217ffd7 (diff) | |
download | vendor_qcom_opensource_power-48bb283d4bb4448bbeaa34182f30bd78f77a3f71.tar.gz vendor_qcom_opensource_power-48bb283d4bb4448bbeaa34182f30bd78f77a3f71.tar.bz2 vendor_qcom_opensource_power-48bb283d4bb4448bbeaa34182f30bd78f77a3f71.zip |
vendor: qcom: powerHal for sdm632
This is power hal for sdm632 used for camera cases
Change-Id: I9ae230993f6e7cb63b317cc26e5f64e2287d9672
Diffstat (limited to 'power-8953.c')
-rw-r--r-- | power-8953.c | 103 |
1 files changed, 91 insertions, 12 deletions
diff --git a/power-8953.c b/power-8953.c index 2781f6b..d0750e4 100644 --- a/power-8953.c +++ b/power-8953.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016, 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 @@ -50,6 +50,8 @@ #include "performance.h" #include "power-common.h" +#define MIN_VAL(X,Y) ((X>Y)?(Y):(X)) + static int saved_interactive_mode = -1; static int display_hint_sent; static int video_encode_hint_sent; @@ -63,6 +65,27 @@ static void process_video_encode_hint(void *metadata); static int display_fd; #define SYS_DISPLAY_PWR "/sys/kernel/hbtp/display_pwr" +static bool is_target_SDM632() /* Returns value=632 if target is SDM632 else value 0 */ +{ + int fd; + bool is_target_SDM632 = false; + 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"); + is_target_SDM632 = false; + } else { + int soc_id = atoi(buf); + if (soc_id == 349 || soc_id == 350) { + is_target_SDM632 = true; /* Above SOCID for SDM632 */ + } + } + } + close(fd); + return is_target_SDM632; +} + int power_hint_override(struct power_module *module, power_hint_t hint, void *data) { @@ -170,7 +193,9 @@ int set_interactive_override(struct power_module *module, int on) /* Video Encode Hint */ static void process_video_encode_hint(void *metadata) { - char governor[80]; + char governor[80] = {0}; + int resource_values[20] = {0}; + int num_resources = 0; struct video_encode_metadata_t video_encode_metadata; ALOGI("Got process_video_encode_hint"); @@ -206,31 +231,85 @@ static void process_video_encode_hint(void *metadata) } if (video_encode_metadata.state == 1) { - if ((strncmp(governor, INTERACTIVE_GOVERNOR, + if((strncmp(governor, SCHEDUTIL_GOVERNOR, + strlen(SCHEDUTIL_GOVERNOR)) == 0) && + (strlen(governor) == strlen(SCHEDUTIL_GOVERNOR))) { + if(is_target_SDM632()) { + /* sample_ms = 10mS + * SLB for Core0 = -6 + * SLB for Core1 = -6 + * SLB for Core2 = -6 + * SLB for Core3 = -6 + * hispeed load = 95 + * hispeed freq = 1036 */ + int res[] = {0x41820000, 0xa, + 0x40c68100, 0xfffffffa, + 0x40c68110, 0xfffffffa, + 0x40c68120, 0xfffffffa, + 0x40c68130, 0xfffffffa, + 0x41440100, 0x5f, + 0x4143c100, 0x40c, + }; + memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); + num_resources = sizeof(res)/sizeof(res[0]); + pthread_mutex_lock(&camera_hint_mutex); + camera_hint_ref_count++; + if (camera_hint_ref_count == 1) { + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, + resource_values, num_resources); + video_encode_hint_sent = 1; + } + } + pthread_mutex_unlock(&camera_hint_mutex); + } + else { + /* sample_ms = 10mS */ + int res[] = {0x41820000, 0xa, + }; + memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); + num_resources = sizeof(res)/sizeof(res[0]); + pthread_mutex_lock(&camera_hint_mutex); + camera_hint_ref_count++; + if (camera_hint_ref_count == 1) { + if (!video_encode_hint_sent) { + perform_hint_action(video_encode_metadata.hint_id, + resource_values, num_resources); + video_encode_hint_sent = 1; + } + } + pthread_mutex_unlock(&camera_hint_mutex); + } + } + else if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { /* Sched_load and migration_notification disable - * timer rate - 40mS*/ - int resource_values[] = {0x41430000, 0x1, - 0x41434000, 0x1, - 0x41424000, 0x28, - }; + * timer rate - 40mS*/ + int res[] = {0x41430000, 0x1, + 0x41434000, 0x1, + 0x41424000, 0x28, + }; + memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res))); + num_resources = sizeof(res)/sizeof(res[0]); pthread_mutex_lock(&camera_hint_mutex); camera_hint_ref_count++; if (camera_hint_ref_count == 1) { if (!video_encode_hint_sent) { perform_hint_action(video_encode_metadata.hint_id, - resource_values, - sizeof(resource_values)/sizeof(resource_values[0])); + resource_values, num_resources); video_encode_hint_sent = 1; } } pthread_mutex_unlock(&camera_hint_mutex); } } else if (video_encode_metadata.state == 0) { - if ((strncmp(governor, INTERACTIVE_GOVERNOR, + if (((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && - (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { + (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) || + ((strncmp(governor, SCHEDUTIL_GOVERNOR, + strlen(SCHEDUTIL_GOVERNOR)) == 0) && + (strlen(governor) == strlen(SCHEDUTIL_GOVERNOR)))) { pthread_mutex_lock(&camera_hint_mutex); camera_hint_ref_count--; if (!camera_hint_ref_count) { |