sdm710-common: power: Handle launch and interaction hints

* MP-CTL does not handle POWER_HINT_INTERACTION and POWER_HINT_LAUNCH
   directly. Requests for processing are sent by Qualcomm BoostFramework
   (QPerformance) at the framework service level. Since we do not have
   BoostFramework, process POWER_HINT_INTERACTION and POWER_HINT_LAUNCH
   in PowerHAL to ensure a sufficient level of performance.
 * For proper operation, perfboostsconfig.xml file is required.

Change-Id: I9fedcbaa189147c91d932711c831c2ce038a7ec7
Signed-off-by: SamarV-121 <samarvispute121@gmail.com>
This commit is contained in:
BeYkeRYkt 2018-12-13 06:42:35 +09:00 committed by SamarV-121
parent 58c18cd468
commit 3d731adb1f
4 changed files with 87 additions and 8 deletions

View file

@ -41,6 +41,22 @@ extern "C" {
#define VENDOR_HINT_DISPLAY_OFF 0x00001040
#define VENDOR_HINT_DISPLAY_ON 0x00001041
#define VENDOR_HINT_FIRST_LAUNCH_BOOST 0x00001081
#define VENDOR_HINT_SCROLL_BOOST 0x00001080
enum {
LAUNCH_BOOST_V1 = 1,
LAUNCH_BOOST_V2 = 2,
LAUNCH_BOOST_V3 = 3
};
enum {
SCROLL_VERTICAL = 1,
SCROLL_HORIZONTAL = 2,
SCROLL_PANEL_VIEW = 3,
SCROLL_PREFILING = 4
};
enum SCREEN_DISPLAY_TYPE {
DISPLAY_OFF = 0x00FF,
};

View file

@ -51,6 +51,10 @@
#define CHECK_HANDLE(x) ((x) > 0)
#define NUM_PERF_MODES 3
const int kMaxInteractiveDuration = 5000; /* ms */
const int kMinInteractiveDuration = 100; /* ms */
const int kMinFlingDuration = 1500; /* ms */
typedef enum {
NORMAL_MODE = 0,
SUSTAINED_MODE = 1,
@ -187,8 +191,53 @@ static int process_video_encode_hint(void* metadata) {
return HINT_NONE;
}
/* Declare function before use */
void interaction(int duration, int num_args, int opt_list[]);
static int process_activity_launch_hint(void* data) {
if (current_mode != NORMAL_MODE) {
ALOGV("%s: ignoring due to other active perf hints", __func__);
} else {
perf_hint_enable_with_type(VENDOR_HINT_FIRST_LAUNCH_BOOST, -1, LAUNCH_BOOST_V1);
}
return HINT_HANDLED;
}
static int process_interaction_hint(void* data) {
struct timeval cur_boost_timeval = {0, 0};
static unsigned long long previous_boost_time = 0;
static unsigned long long previous_duration = 0;
unsigned long long cur_boost_time;
double elapsed_time;
int duration = kMinInteractiveDuration;
if (current_mode != NORMAL_MODE) {
ALOGV("%s: ignoring due to other active perf hints", __func__);
return HINT_HANDLED;
}
if (data) {
int input_duration = *((int*)data);
if (input_duration > duration) {
duration = (input_duration > kMaxInteractiveDuration) ?
kMaxInteractiveDuration : input_duration;
}
}
gettimeofday(&cur_boost_timeval, NULL);
cur_boost_time = cur_boost_timeval.tv_sec * 1000000 + cur_boost_timeval.tv_usec;
elapsed_time = (double) (cur_boost_time - previous_boost_time);
// don't hint if previous hint's duration covers this hint's duration
if ((previous_duration * 1000) > (elapsed_time + duration * 1000)) {
return HINT_HANDLED;
}
previous_boost_time = cur_boost_time;
previous_duration = duration;
if (duration >= kMinFlingDuration) {
perf_hint_enable_with_type(VENDOR_HINT_SCROLL_BOOST, -1, SCROLL_PREFILING);
} else {
perf_hint_enable_with_type(VENDOR_HINT_SCROLL_BOOST, duration, SCROLL_VERTICAL);
}
return HINT_HANDLED;
}
int power_hint_override(struct power_module* module, power_hint_t hint, void* data) {
int ret_val = HINT_NONE;
@ -202,12 +251,12 @@ int power_hint_override(struct power_module* module, power_hint_t hint, void* da
case POWER_HINT_VR_MODE:
ret_val = process_perf_hint(data, VR_MODE);
break;
case POWER_HINT_INTERACTION: {
int resources[] = {0x40800100, 0x514};
int duration = 100;
interaction(duration, sizeof(resources) / sizeof(resources[0]), resources);
ret_val = HINT_HANDLED;
} break;
case POWER_HINT_INTERACTION:
ret_val = process_interaction_hint(data);
break;
case POWER_HINT_LAUNCH:
ret_val = process_activity_launch_hint(data);
break;
default:
break;
}

View file

@ -233,6 +233,19 @@ int perf_hint_enable(int hint_id, int duration) {
return lock_handle;
}
// same as perf_hint_enable, but with the ability to choose the type
int perf_hint_enable_with_type(int hint_id, int duration, int type) {
int lock_handle = 0;
if (qcopt_handle) {
if (perf_hint) {
lock_handle = perf_hint(hint_id, NULL, duration, type);
if (lock_handle == -1) ALOGE("Failed to acquire lock.");
}
}
return lock_handle;
}
void release_request(int lock_handle) {
if (qcopt_handle && perf_lock_rel) perf_lock_rel(lock_handle);
}

View file

@ -44,3 +44,4 @@ void undo_hint_action(int hint_id);
void release_request(int lock_handle);
int interaction_with_handle(int lock_handle, int duration, int num_args, int opt_list[]);
int perf_hint_enable(int hint_id, int duration);
int perf_hint_enable_with_type(int hint_id, int duration, int type);