Home | History | Annotate | Download | only in power
      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