blob: d4b020d8e1b3e566ebabb2c494d25879012e35ff [file] [log] [blame]
Dilip Gudlure9f9c982015-01-28 15:17:45 -08001/*
2 * Copyright (c) 2015, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29#define LOG_NIDEBUG 0
30
31#include <errno.h>
32#include <string.h>
33#include <sys/types.h>
34#include <sys/stat.h>
35#include <fcntl.h>
36#include <dlfcn.h>
37#include <stdlib.h>
38
39#define LOG_TAG "QCOM PowerHAL"
Ethan Chena42f4a82018-03-01 21:31:15 -080040#include <log/log.h>
Dilip Gudlure9f9c982015-01-28 15:17:45 -080041#include <hardware/hardware.h>
42#include <hardware/power.h>
43
44#include "utils.h"
45#include "metadata-defs.h"
46#include "hint-data.h"
47#include "performance.h"
48#include "power-common.h"
49
Dilip Gudlure9f9c982015-01-28 15:17:45 -080050static int process_video_encode_hint(void *metadata)
51{
52 char governor[80];
53 struct video_encode_metadata_t video_encode_metadata;
54
55 if (get_scaling_governor(governor, sizeof(governor)) == -1) {
56 ALOGE("Can't obtain scaling governor.");
57
58 return HINT_NONE;
59 }
60
61 /* Initialize encode metadata struct fields */
62 memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t));
63 video_encode_metadata.state = -1;
64 video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID;
65
66 if (metadata) {
67 if (parse_video_encode_metadata((char *)metadata, &video_encode_metadata) ==
68 -1) {
69 ALOGE("Error occurred while parsing metadata.");
70 return HINT_NONE;
71 }
72 } else {
73 return HINT_NONE;
74 }
75
76 if (video_encode_metadata.state == 1) {
Ethan Chen4b4acdf2018-03-01 21:41:04 -080077 if (is_interactive_governor(governor)) {
Dilip Gudlure9f9c982015-01-28 15:17:45 -080078 /* sched and cpufreq params
79 * hispeed freq - 768 MHz
80 * target load - 90
81 * above_hispeed_delay - 40ms
82 * sched_small_tsk - 50
83 */
84 int resource_values[] = {0x2C07, 0x2F5A, 0x2704, 0x4032};
85
86 perform_hint_action(video_encode_metadata.hint_id,
Zhao Wei Liewd4fe61e2016-06-26 11:37:59 +080087 resource_values, ARRAY_SIZE(resource_values));
Dilip Gudlure9f9c982015-01-28 15:17:45 -080088 return HINT_HANDLED;
89 }
90 } else if (video_encode_metadata.state == 0) {
Ethan Chen4b4acdf2018-03-01 21:41:04 -080091 if (is_interactive_governor(governor)) {
Dilip Gudlure9f9c982015-01-28 15:17:45 -080092 undo_hint_action(video_encode_metadata.hint_id);
93 return HINT_HANDLED;
94 }
95 }
96 return HINT_NONE;
97}
98
99int power_hint_override(power_hint_t hint, void *data)
100{
101 int ret_val = HINT_NONE;
102 switch(hint) {
103 case POWER_HINT_VIDEO_ENCODE:
104 ret_val = process_video_encode_hint(data);
105 break;
106 default:
107 break;
108 }
109 return ret_val;
110}
111
112int set_interactive_override(int on)
113{
Dilip Gudlure9f9c982015-01-28 15:17:45 -0800114 char governor[80];
115
116 if (get_scaling_governor(governor, sizeof(governor)) == -1) {
117 ALOGE("Can't obtain scaling governor.");
118
119 return HINT_NONE;
120 }
121
122 if (!on) {
123 /* Display off */
Ethan Chen4b4acdf2018-03-01 21:41:04 -0800124 if (is_interactive_governor(governor)) {
Dilip Gudlur90608e22015-06-30 12:14:36 -0700125 int resource_values[] = {0x777}; /* 4+0 core config in display off */
Zhao Wei Liew5a81c9a2016-06-26 21:29:34 +0800126 perform_hint_action(DISPLAY_STATE_HINT_ID,
127 resource_values, ARRAY_SIZE(resource_values));
128 return HINT_HANDLED;
Dilip Gudlure9f9c982015-01-28 15:17:45 -0800129 }
130 } else {
131 /* Display on */
Ethan Chen4b4acdf2018-03-01 21:41:04 -0800132 if (is_interactive_governor(governor)) {
Dilip Gudlure9f9c982015-01-28 15:17:45 -0800133 undo_hint_action(DISPLAY_STATE_HINT_ID);
Dilip Gudlure9f9c982015-01-28 15:17:45 -0800134 return HINT_HANDLED;
135 }
136 }
137 return HINT_NONE;
138}