1 /* 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" 40 #include <utils/Log.h> 41 #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 50 static int display_hint_sent; 51 52 static int process_video_encode_hint(void *metadata) 53 { 54 char governor[80]; 55 struct video_encode_metadata_t video_encode_metadata; 56 57 if (get_scaling_governor(governor, sizeof(governor)) == -1) { 58 ALOGE("Can't obtain scaling governor."); 59 60 return HINT_NONE; 61 } 62 63 /* Initialize encode metadata struct fields */ 64 memset(&video_encode_metadata, 0, sizeof(struct video_encode_metadata_t)); 65 video_encode_metadata.state = -1; 66 video_encode_metadata.hint_id = DEFAULT_VIDEO_ENCODE_HINT_ID; 67 68 if (metadata) { 69 if (parse_video_encode_metadata((char *)metadata, &video_encode_metadata) == 70 -1) { 71 ALOGE("Error occurred while parsing metadata."); 72 return HINT_NONE; 73 } 74 } else { 75 return HINT_NONE; 76 } 77 78 if (video_encode_metadata.state == 1) { 79 if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && 80 (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { 81 /* sched and cpufreq params 82 * A57 - offlines 83 * A53 - 4 cores online at 1.2GHz 84 */ 85 int resource_values[] = {0x150C, 0x160C, 0x170C, 0x180C, 0x3DFF}; 86 87 perform_hint_action(video_encode_metadata.hint_id, 88 resource_values, sizeof(resource_values)/sizeof(resource_values[0])); 89 return HINT_HANDLED; 90 } 91 } else if (video_encode_metadata.state == 0) { 92 if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && 93 (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { 94 undo_hint_action(video_encode_metadata.hint_id); 95 return HINT_HANDLED; 96 } 97 } 98 return HINT_NONE; 99 } 100 101 int power_hint_override(struct power_module *module, power_hint_t hint, void *data) 102 { 103 int ret_val = HINT_NONE; 104 switch(hint) { 105 case POWER_HINT_VIDEO_ENCODE: 106 ret_val = process_video_encode_hint(data); 107 break; 108 default: 109 break; 110 } 111 return ret_val; 112 } 113 114 int set_interactive_override(struct power_module *module, int on) 115 { 116 return HINT_HANDLED; /* Don't excecute this code path, not in use */ 117 char governor[80]; 118 119 if (get_scaling_governor(governor, sizeof(governor)) == -1) { 120 ALOGE("Can't obtain scaling governor."); 121 122 return HINT_NONE; 123 } 124 125 if (!on) { 126 /* Display off */ 127 if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && 128 (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { 129 int resource_values[] = {}; /* dummy node */ 130 if (!display_hint_sent) { 131 perform_hint_action(DISPLAY_STATE_HINT_ID, 132 resource_values, sizeof(resource_values)/sizeof(resource_values[0])); 133 display_hint_sent = 1; 134 return HINT_HANDLED; 135 } 136 } 137 } else { 138 /* Display on */ 139 if ((strncmp(governor, INTERACTIVE_GOVERNOR, strlen(INTERACTIVE_GOVERNOR)) == 0) && 140 (strlen(governor) == strlen(INTERACTIVE_GOVERNOR))) { 141 undo_hint_action(DISPLAY_STATE_HINT_ID); 142 display_hint_sent = 0; 143 return HINT_HANDLED; 144 } 145 } 146 return HINT_NONE; 147 } 148