Home | History | Annotate | Download | only in fb
      1 /*
      2 * Copyright (c) 2015-2016, 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 
     30 #include <ctype.h>
     31 #include <math.h>
     32 #include <fcntl.h>
     33 #include <inttypes.h>
     34 #include <sys/types.h>
     35 #include <sys/stat.h>
     36 #include <sys/resource.h>
     37 #include <sys/prctl.h>
     38 #include <linux/msm_mdp.h>
     39 #include <utils/constants.h>
     40 #include <utils/debug.h>
     41 #include "hw_color_manager.h"
     42 
     43 #define __CLASS__ "HWColorManager"
     44 
     45 namespace sdm {
     46 
     47 DisplayError (*HWColorManager::SetFeature[])(const PPFeatureInfo &, msmfb_mdp_pp *) = {
     48         [kGlobalColorFeaturePcc] = &HWColorManager::SetPCC,
     49         [kGlobalColorFeatureIgc] = &HWColorManager::SetIGC,
     50         [kGlobalColorFeaturePgc] = &HWColorManager::SetPGC,
     51         [kMixerColorFeatureGc] = &HWColorManager::SetMixerGC,
     52         [kGlobalColorFeaturePaV2] = &HWColorManager::SetPAV2,
     53         [kGlobalColorFeatureDither] = &HWColorManager::SetDither,
     54         [kGlobalColorFeatureGamut] = &HWColorManager::SetGamut,
     55         [kGlobalColorFeaturePADither] = &HWColorManager::SetPADither,
     56 };
     57 
     58 DisplayError HWColorManager::SetPCC(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
     59   DisplayError ret = kErrorNone;
     60 
     61   kernel_params->op = mdp_op_pcc_cfg;
     62   kernel_params->data.pcc_cfg_data.version = feature.feature_version_;
     63   kernel_params->data.pcc_cfg_data.block = MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
     64   kernel_params->data.pcc_cfg_data.ops = feature.enable_flags_;
     65   kernel_params->data.pcc_cfg_data.cfg_payload = feature.GetConfigData();
     66   DLOGV_IF(kTagQDCM, "kernel params version = %d, block = %d, flags = %d",
     67            kernel_params->data.pcc_cfg_data.version, kernel_params->data.pcc_cfg_data.block,
     68            kernel_params->data.pcc_cfg_data.ops);
     69 
     70   return ret;
     71 }
     72 
     73 DisplayError HWColorManager::SetIGC(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
     74   DisplayError ret = kErrorNone;
     75 
     76   kernel_params->op = mdp_op_lut_cfg;
     77   kernel_params->data.lut_cfg_data.lut_type = mdp_lut_igc;
     78   kernel_params->data.lut_cfg_data.data.igc_lut_data.block =
     79       MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
     80   kernel_params->data.lut_cfg_data.data.igc_lut_data.version = feature.feature_version_;
     81   kernel_params->data.lut_cfg_data.data.igc_lut_data.ops = feature.enable_flags_;
     82   kernel_params->data.lut_cfg_data.data.igc_lut_data.cfg_payload = feature.GetConfigData();
     83 
     84   return ret;
     85 }
     86 
     87 DisplayError HWColorManager::SetPGC(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
     88   DisplayError ret = kErrorNone;
     89 
     90   kernel_params->op = mdp_op_lut_cfg;
     91   kernel_params->data.lut_cfg_data.lut_type = mdp_lut_pgc;
     92   kernel_params->data.lut_cfg_data.data.pgc_lut_data.version = feature.feature_version_;
     93   kernel_params->data.lut_cfg_data.data.pgc_lut_data.block =
     94       MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
     95   kernel_params->data.lut_cfg_data.data.pgc_lut_data.flags = feature.enable_flags_;
     96   kernel_params->data.lut_cfg_data.data.pgc_lut_data.cfg_payload = feature.GetConfigData();
     97 
     98   return ret;
     99 }
    100 
    101 DisplayError HWColorManager::SetMixerGC(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
    102   DisplayError ret = kErrorNone;
    103 
    104   kernel_params->op = mdp_op_lut_cfg;
    105   kernel_params->data.lut_cfg_data.lut_type = mdp_lut_pgc;
    106   kernel_params->data.lut_cfg_data.data.pgc_lut_data.version = feature.feature_version_;
    107   kernel_params->data.lut_cfg_data.data.pgc_lut_data.block =
    108       (MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_) | MDSS_PP_LM_CFG;
    109   kernel_params->data.lut_cfg_data.data.pgc_lut_data.flags = feature.enable_flags_;
    110   kernel_params->data.lut_cfg_data.data.pgc_lut_data.cfg_payload = feature.GetConfigData();
    111   return ret;
    112 }
    113 
    114 DisplayError HWColorManager::SetPAV2(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
    115   DisplayError ret = kErrorNone;
    116 
    117   kernel_params->op = mdp_op_pa_v2_cfg;
    118   kernel_params->data.pa_v2_cfg_data.version = feature.feature_version_;
    119   kernel_params->data.pa_v2_cfg_data.block = MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
    120   kernel_params->data.pa_v2_cfg_data.flags = feature.enable_flags_;
    121   kernel_params->data.pa_v2_cfg_data.cfg_payload = feature.GetConfigData();
    122   DLOGV_IF(kTagQDCM, "kernel params version = %d, block = %d, flags = %d",
    123            kernel_params->data.pa_v2_cfg_data.version, kernel_params->data.pa_v2_cfg_data.block,
    124            kernel_params->data.pa_v2_cfg_data.flags);
    125 
    126   return ret;
    127 }
    128 
    129 DisplayError HWColorManager::SetDither(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
    130   DisplayError ret = kErrorNone;
    131 
    132   kernel_params->op = mdp_op_dither_cfg;
    133   kernel_params->data.dither_cfg_data.version = feature.feature_version_;
    134   kernel_params->data.dither_cfg_data.block = MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
    135   kernel_params->data.dither_cfg_data.flags = feature.enable_flags_;
    136   kernel_params->data.dither_cfg_data.cfg_payload = feature.GetConfigData();
    137 
    138   return ret;
    139 }
    140 
    141 DisplayError HWColorManager::SetGamut(const PPFeatureInfo &feature, msmfb_mdp_pp *kernel_params) {
    142   DisplayError ret = kErrorNone;
    143 
    144   kernel_params->op = mdp_op_gamut_cfg;
    145   kernel_params->data.gamut_cfg_data.version = feature.feature_version_;
    146   kernel_params->data.gamut_cfg_data.block = MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
    147   kernel_params->data.gamut_cfg_data.flags = feature.enable_flags_;
    148   kernel_params->data.gamut_cfg_data.cfg_payload = feature.GetConfigData();
    149 
    150   return ret;
    151 }
    152 
    153 DisplayError HWColorManager::SetPADither(const PPFeatureInfo &feature,
    154                                          msmfb_mdp_pp *kernel_params) {
    155   DisplayError ret = kErrorNone;
    156 #ifdef PA_DITHER
    157   kernel_params->op = mdp_op_pa_dither_cfg;
    158   kernel_params->data.dither_cfg_data.version = feature.feature_version_;
    159   kernel_params->data.dither_cfg_data.block = MDP_LOGICAL_BLOCK_DISP_0 + feature.disp_id_;
    160   kernel_params->data.dither_cfg_data.flags = feature.enable_flags_;
    161   kernel_params->data.dither_cfg_data.cfg_payload = feature.GetConfigData();
    162 #endif
    163   return ret;
    164 }
    165 
    166 }  // namespace sdm
    167