mdp_version.cpp revision 7dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7
10c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* 20c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. 356f610dd235b577725198e9341caae92379fdf23Saurabh Shah 40c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Redistribution and use in source and binary forms, with or without 50c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * modification, are permitted provided that the following conditions are 60c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * met: 70c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * * Redistributions of source code must retain the above copyright 80c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * notice, this list of conditions and the following disclaimer. 90c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * * Redistributions in binary form must reproduce the above 100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * copyright notice, this list of conditions and the following 110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * disclaimer in the documentation and/or other materials provided 120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * with the distribution. 130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * * Neither the name of The Linux Foundation nor the names of its 140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * contributors may be used to endorse or promote products derived 150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * from this software without specific prior written permission. 160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * 170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2556f610dd235b577725198e9341caae92379fdf23Saurabh Shah * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed */ 290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <cutils/log.h> 3051df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed#include <linux/msm_mdp.h> 3151df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed#include "mdp_version.h" 3251df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed 3351df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed#define DEBUG 0 3451df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed 3551df92ad0726a419494465752bdd53eaebf91ee3Naseer AhmedANDROID_SINGLETON_STATIC_INSTANCE(qdutils::MDPVersion); 3651df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmednamespace qdutils { 3751df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed 3851df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed#define TOKEN_PARAMS_DELIM "=" 3951df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed 4051df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed#ifndef MDSS_MDP_REV 4151df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmedenum mdp_rev { 4251df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_100 = 0x10000000, //8974 v1 4351df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_101 = 0x10010000, //8x26 4451df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_102 = 0x10020000, //8974 v2 4551df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_103 = 0x10030000, //8084 4651df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_104 = 0x10040000, //Next version 4751df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_105 = 0x10050000, //Next version 4851df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed MDSS_MDP_HW_REV_107 = 0x10070000, //Next version 490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed MDSS_MDP_HW_REV_200 = 0x20000000, //8092 500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed MDSS_MDP_HW_REV_206 = 0x20060000, //Future 510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#else 530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedenum mdp_rev { 540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed MDSS_MDP_HW_REV_104 = 0x10040000, //Next version 550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed MDSS_MDP_HW_REV_206 = 0x20060000, //Future 560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 5756f610dd235b577725198e9341caae92379fdf23Saurabh Shah#endif 5856f610dd235b577725198e9341caae92379fdf23Saurabh Shah 5956f610dd235b577725198e9341caae92379fdf23Saurabh ShahMDPVersion::MDPVersion() 6056f610dd235b577725198e9341caae92379fdf23Saurabh Shah{ 610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mMDPVersion = MDSS_V5; 620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mMdpRev = 0; 633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mRGBPipes = 0; 640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mVGPipes = 0; 650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mDMAPipes = 0; 66f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mFeatures = 0; 6796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed mMDPUpscale = 0; 683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mMDPDownscale = 0; 693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mMacroTileEnabled = false; 70f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mPanelType = NO_PANEL; 71f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mLowBw = 0; 723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHighBw = 0; 733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mSourceSplit = false; 740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(!updatePanelInfo()) { 760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ALOGE("Unable to read Primary Panel Information"); 770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(!updateSysFsInfo()) { 790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ALOGE("Unable to read display sysfs node"); 800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (mMdpRev == MDP_V3_0_4){ 820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mMDPVersion = MDP_V3_0_4; 830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mHasOverlay = false; 860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if((mMDPVersion >= MDP_V4_0) || 8772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed (mMDPVersion == MDP_V_UNKNOWN) || 880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed (mMDPVersion == MDP_V3_0_4)) 893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHasOverlay = true; 903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(!updateSplitInfo()) { 910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ALOGE("Unable to read display split node"); 920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer AhmedMDPVersion::~MDPVersion() { 960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(mFd); 970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedint MDPVersion::tokenizeParams(char *inputParams, const char *delim, 1000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char* tokenStr[], int *idx) { 101f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed char *tmp_token = NULL; 10256f610dd235b577725198e9341caae92379fdf23Saurabh Shah char *temp_ptr; 10356f610dd235b577725198e9341caae92379fdf23Saurabh Shah int index = 0; 10456f610dd235b577725198e9341caae92379fdf23Saurabh Shah if (!inputParams) { 10556f610dd235b577725198e9341caae92379fdf23Saurabh Shah return -1; 1060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed tmp_token = strtok_r(inputParams, delim, &temp_ptr); 1080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed while (tmp_token != NULL) { 1090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed tokenStr[index++] = tmp_token; 1100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed tmp_token = strtok_r(NULL, " ", &temp_ptr); 1110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *idx = index; 1130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 0; 1140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 1153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah// This function reads the sysfs node to read the primary panel type 1160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// and updates information accordingly 1173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool MDPVersion::updatePanelInfo() { 1183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah FILE *displayDeviceFP = NULL; 1193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const int MAX_FRAME_BUFFER_NAME_SIZE = 128; 1200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 1213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const char *strCmdPanel = "mipi dsi cmd panel"; 1220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const char *strVideoPanel = "mipi dsi video panel"; 12351df92ad0726a419494465752bdd53eaebf91ee3Naseer Ahmed const char *strLVDSPanel = "lvds panel"; 1240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const char *strEDPPanel = "edp panel"; 1250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 1260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed displayDeviceFP = fopen("/sys/class/graphics/fb0/msm_fb_type", "r"); 1270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(displayDeviceFP){ 1283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 1293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah displayDeviceFP); 1303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(strncmp(fbType, strCmdPanel, strlen(strCmdPanel)) == 0) { 1313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mPanelType = MIPI_CMD_PANEL; 1323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 1333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah else if(strncmp(fbType, strVideoPanel, strlen(strVideoPanel)) == 0) { 1343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mPanelType = MIPI_VIDEO_PANEL; 1350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else if(strncmp(fbType, strLVDSPanel, strlen(strLVDSPanel)) == 0) { 1370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mPanelType = LVDS_PANEL; 1380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else if(strncmp(fbType, strEDPPanel, strlen(strEDPPanel)) == 0) { 1400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mPanelType = EDP_PANEL; 1410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed fclose(displayDeviceFP); 1430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return true; 1440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed }else { 1453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return false; 1460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 1480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 1490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// This function reads the sysfs node to read MDP capabilities 1500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// and parses and updates information accordingly. 1510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedbool MDPVersion::updateSysFsInfo() { 1520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed FILE *sysfsFd; 1530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed size_t len = PAGE_SIZE; 15472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ssize_t read; 1550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char *line = NULL; 1560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char sysfsPath[255]; 1570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed memset(sysfsPath, 0, sizeof(sysfsPath)); 1583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah snprintf(sysfsPath , sizeof(sysfsPath), 1590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed "/sys/class/graphics/fb0/mdp/caps"); 1600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char property[PROPERTY_VALUE_MAX]; 1613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah bool enableMacroTile = false; 1623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 1633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if((property_get("persist.hwc.macro_tile_enable", property, NULL) > 0) && 1643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 1650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 166f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed enableMacroTile = true; 1670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 1680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 1690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed sysfsFd = fopen(sysfsPath, "rb"); 1703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 1713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (sysfsFd == NULL) { 1723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("%s: sysFsFile file '%s' not found", 1730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed __FUNCTION__, sysfsPath); 174f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return false; 1750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 1760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed line = (char *) malloc(len); 1770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed while((read = getline(&line, &len, sysfsFd)) != -1) { 1780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int index=0; 1790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char *tokens[10]; 1800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed memset(tokens, 0, sizeof(tokens)); 1810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 1820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // parse the line and update information accordingly 1830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(!tokenizeParams(line, TOKEN_PARAMS_DELIM, tokens, &index)) { 1840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(!strncmp(tokens[0], "hw_rev", strlen("hw_rev"))) { 1850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mMdpRev = atoi(tokens[1]); 1860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 187 else if(!strncmp(tokens[0], "rgb_pipes", strlen("rgb_pipes"))) { 188 mRGBPipes = atoi(tokens[1]); 189 } 190 else if(!strncmp(tokens[0], "vig_pipes", strlen("vig_pipes"))) { 191 mVGPipes = atoi(tokens[1]); 192 } 193 else if(!strncmp(tokens[0], "dma_pipes", strlen("dma_pipes"))) { 194 mDMAPipes = atoi(tokens[1]); 195 } 196 else if(!strncmp(tokens[0], "max_downscale_ratio", 197 strlen("max_downscale_ratio"))) { 198 mMDPDownscale = atoi(tokens[1]); 199 } 200 else if(!strncmp(tokens[0], "max_upscale_ratio", 201 strlen("max_upscale_ratio"))) { 202 mMDPUpscale = atoi(tokens[1]); 203 } else if(!strncmp(tokens[0], "max_bandwidth_low", 204 strlen("max_bandwidth_low"))) { 205 mLowBw = atol(tokens[1]); 206 } else if(!strncmp(tokens[0], "max_bandwidth_high", 207 strlen("max_bandwidth_high"))) { 208 mHighBw = atol(tokens[1]); 209 } else if(!strncmp(tokens[0], "features", strlen("features"))) { 210 for(int i=1; i<index;i++) { 211 if(!strncmp(tokens[i], "bwc", strlen("bwc"))) { 212 mFeatures |= MDP_BWC_EN; 213 } 214 else if(!strncmp(tokens[i], "decimation", 215 strlen("decimation"))) { 216 mFeatures |= MDP_DECIMATION_EN; 217 } 218 else if(!strncmp(tokens[i], "tile_format", 219 strlen("tile_format"))) { 220 if(enableMacroTile) 221 mMacroTileEnabled = true; 222 } else if(!strncmp(tokens[i], "src_split", 223 strlen("src_split"))) { 224 mSourceSplit = true; 225 } 226 } 227 } 228 } 229 } 230 free(line); 231 fclose(sysfsFd); 232 } 233 ALOGD_IF(DEBUG, "%s: mMDPVersion: %d mMdpRev: %x mRGBPipes:%d," 234 "mVGPipes:%d", __FUNCTION__, mMDPVersion, mMdpRev, 235 mRGBPipes, mVGPipes); 236 ALOGD_IF(DEBUG, "%s:mDMAPipes:%d \t mMDPDownscale:%d, mFeatures:%d", 237 __FUNCTION__, mDMAPipes, mMDPDownscale, mFeatures); 238 ALOGD_IF(DEBUG, "%s:mLowBw: %lu mHighBw: %lu", __FUNCTION__, mLowBw, 239 mHighBw); 240 241 return true; 242} 243 244// This function reads the sysfs node to read MDP capabilities 245// and parses and updates information accordingly. 246bool MDPVersion::updateSplitInfo() { 247 if(mMDPVersion >= MDSS_V5) { 248 char split[64] = {0}; 249 FILE* fp = fopen("/sys/class/graphics/fb0/msm_fb_split", "r"); 250 if(fp){ 251 //Format "left right" space as delimiter 252 if(fread(split, sizeof(char), 64, fp)) { 253 split[sizeof(split) - 1] = '\0'; 254 mSplit.mLeft = atoi(split); 255 ALOGI_IF(mSplit.mLeft, "Left Split=%d", mSplit.mLeft); 256 char *rght = strpbrk(split, " "); 257 if(rght) 258 mSplit.mRight = atoi(rght + 1); 259 ALOGI_IF(mSplit.mRight, "Right Split=%d", mSplit.mRight); 260 } 261 } else { 262 ALOGE("Failed to open mdss_fb_split node"); 263 return false; 264 } 265 if(fp) 266 fclose(fp); 267 } 268 return true; 269} 270 271 272bool MDPVersion::supportsDecimation() { 273 return mFeatures & MDP_DECIMATION_EN; 274} 275 276uint32_t MDPVersion::getMaxMDPDownscale() { 277 return mMDPDownscale; 278} 279 280uint32_t MDPVersion::getMaxMDPUpscale() { 281 return mMDPUpscale; 282} 283 284bool MDPVersion::supportsBWC() { 285 // BWC - Bandwidth Compression 286 return (mFeatures & MDP_BWC_EN); 287} 288 289bool MDPVersion::supportsMacroTile() { 290 // MACRO TILE support 291 return mMacroTileEnabled; 292} 293 294bool MDPVersion::isSrcSplit() const { 295 return mSourceSplit; 296} 297 298bool MDPVersion::is8x26() { 299 return (mMdpRev >= MDSS_MDP_HW_REV_101 and 300 mMdpRev < MDSS_MDP_HW_REV_102); 301} 302 303bool MDPVersion::is8x74v2() { 304 return (mMdpRev >= MDSS_MDP_HW_REV_102 and 305 mMdpRev < MDSS_MDP_HW_REV_103); 306} 307 308bool MDPVersion::is8084() { 309 return (mMdpRev >= MDSS_MDP_HW_REV_103 and 310 mMdpRev < MDSS_MDP_HW_REV_104); 311} 312 313bool MDPVersion::is8092() { 314 return (mMdpRev >= MDSS_MDP_HW_REV_200 and 315 mMdpRev < MDSS_MDP_HW_REV_206); 316} 317 318}; //namespace qdutils 319 320