107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* 207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. 307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Redistribution and use in source and binary forms, with or without 507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * modification, are permitted provided that the following conditions are 607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * met: 707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * * Redistributions of source code must retain the above copyright 807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * notice, this list of conditions and the following disclaimer. 907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * * Redistributions in binary form must reproduce the above 1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * copyright notice, this list of conditions and the following 1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * disclaimer in the documentation and/or other materials provided 1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * with the distribution. 1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * * Neither the name of The Linux Foundation nor the names of its 1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * contributors may be used to endorse or promote products derived 1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * from this software without specific prior written permission. 1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */ 2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/log.h> 3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <linux/msm_mdp.h> 3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "mdp_version.h" 3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "qd_utils.h" 3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define DEBUG 0 3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant MalaniANDROID_SINGLETON_STATIC_INSTANCE(qdutils::MDPVersion); 3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace qdutils { 3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define TOKEN_PARAMS_DELIM "=" 4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// chip variants have same major number and minor numbers usually vary 4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// for e.g., MDSS_MDP_HW_REV_101 is 0x10010000 4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 1001 - major number 4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 0000 - minor number 4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// 8x26 v1 minor number is 0000 4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// v2 minor number is 0001 etc.. 4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_100 4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_100 0x10000000 //8974 v1 4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_101 5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_101 0x10010000 //8x26 5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_102 5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_102 0x10020000 //8974 v2 5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_103 5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_103 0x10030000 //8084 5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_104 6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_104 0x10040000 //Next version 6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_105 6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_105 0x10050000 //8994 6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_106 6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_106 0x10060000 //8x16 6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_107 6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_107 0x10070000 //Next version 7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_108 7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_108 0x10080000 //8x39 & 8x36 7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_109 7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_109 0x10090000 //Next version 7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_200 7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_200 0x20000000 //8092 7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef MDSS_MDP_HW_REV_206 8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MDSS_MDP_HW_REV_206 0x20060000 //Future 8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif 8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant MalaniMDPVersion::MDPVersion() 8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{ 8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPVersion = MDSS_V5; 8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev = 0; 8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRGBPipes = 0; 8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mVGPipes = 0; 9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mDMAPipes = 0; 9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mFeatures = 0; 9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPUpscale = 1; 9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPDownscale = 1; 9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMacroTileEnabled = false; 9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mLowBw = 0; 9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mHighBw = 0; 9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSourceSplit = false; 9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSourceSplitAlways = false; 9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRGBHasNoScalar = false; 10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRotDownscale = false; 10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // this is the default limit of mixer unless driver reports it. 10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // For resolutions beyond this, we use dual/split overlay pipes. 10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMaxMixerWidth = 2048; 10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani updatePanelInfo(); 10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!updateSysFsInfo()) { 10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Unable to read display sysfs node"); 11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if (mMdpRev == MDP_V3_0_4){ 11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPVersion = MDP_V3_0_4; 11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if (mMdpRev == MDP_V3_0_5){ 11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPVersion = MDP_V3_0_5; 11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mHasOverlay = false; 11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((mMDPVersion >= MDP_V4_0) || 12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (mMDPVersion == MDP_V_UNKNOWN) || 12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (mMDPVersion == MDP_V3_0_4) || 12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (mMDPVersion == MDP_V3_0_5)) 12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mHasOverlay = true; 12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!updateSplitInfo()) { 12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Unable to read display split node"); 12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant MalaniMDPVersion::~MDPVersion() { 13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani close(mFd); 13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint MDPVersion::tokenizeParams(char *inputParams, const char *delim, 13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char* tokenStr[], int *idx) { 13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *tmp_token = NULL; 13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *temp_ptr; 13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int index = 0; 13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if (!inputParams) { 13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return -1; 14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani tmp_token = strtok_r(inputParams, delim, &temp_ptr); 14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani while (tmp_token != NULL) { 14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani tokenStr[index++] = tmp_token; 14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani tmp_token = strtok_r(NULL, " ", &temp_ptr); 14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *idx = index; 14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return 0; 14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// This function reads the sysfs node to read the primary panel type 15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// and updates information accordingly 15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid MDPVersion::updatePanelInfo() { 15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani FILE *displayDeviceFP = NULL; 15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani FILE *panelInfoNodeFP = NULL; 15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const char *strCmdPanel = "mipi dsi cmd panel"; 15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const char *strVideoPanel = "mipi dsi video panel"; 15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const char *strLVDSPanel = "lvds panel"; 15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const char *strEDPPanel = "edp panel"; 15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 16007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani displayDeviceFP = fopen("/sys/class/graphics/fb0/msm_fb_type", "r"); 16107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(displayDeviceFP){ 16207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 16307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani displayDeviceFP); 16407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(strncmp(fbType, strCmdPanel, strlen(strCmdPanel)) == 0) { 16507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mType = MIPI_CMD_PANEL; 16607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 16707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(strncmp(fbType, strVideoPanel, strlen(strVideoPanel)) == 0) { 16807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mType = MIPI_VIDEO_PANEL; 16907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 17007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(strncmp(fbType, strLVDSPanel, strlen(strLVDSPanel)) == 0) { 17107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mType = LVDS_PANEL; 17207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 17307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(strncmp(fbType, strEDPPanel, strlen(strEDPPanel)) == 0) { 17407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mType = EDP_PANEL; 17507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 17607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fclose(displayDeviceFP); 17707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 17807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Unable to read Primary Panel Information"); 17907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 18007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 18107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani panelInfoNodeFP = fopen("/sys/class/graphics/fb0/msm_fb_panel_info", "r"); 18207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(panelInfoNodeFP){ 18307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani size_t len = PAGE_SIZE; 18407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ssize_t read; 18507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *readLine = (char *) malloc (len); 18607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char property[PROPERTY_VALUE_MAX]; 18707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani while((read = getline((char **)&readLine, &len, 18807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani panelInfoNodeFP)) != -1) { 18907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int token_ct=0; 19007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *tokens[10]; 19107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani memset(tokens, 0, sizeof(tokens)); 19207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 19307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!tokenizeParams(readLine, TOKEN_PARAMS_DELIM, tokens, 19407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani &token_ct)) { 19507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "pu_en", strlen("pu_en"))) { 19607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mPartialUpdateEnable = atoi(tokens[1]); 19707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("PartialUpdate status: %s", 19807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mPartialUpdateEnable? "Enabled" : 19907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "Disabled"); 20007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 20107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "xstart", strlen("xstart"))) { 20207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mLeftAlign = atoi(tokens[1]); 20307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Left Align: %d", mPanelInfo.mLeftAlign); 20407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 20507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "walign", strlen("walign"))) { 20607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mWidthAlign = atoi(tokens[1]); 20707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Width Align: %d", mPanelInfo.mWidthAlign); 20807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 20907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "ystart", strlen("ystart"))) { 21007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mTopAlign = atoi(tokens[1]); 21107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Top Align: %d", mPanelInfo.mTopAlign); 21207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 21307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "halign", strlen("halign"))) { 21407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mHeightAlign = atoi(tokens[1]); 21507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Height Align: %d", mPanelInfo.mHeightAlign); 21607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 21707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "min_w", strlen("min_w"))) { 21807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mMinROIWidth = atoi(tokens[1]); 21907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Min ROI Width: %d", mPanelInfo.mMinROIWidth); 22007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 22107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "min_h", strlen("min_h"))) { 22207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mMinROIHeight = atoi(tokens[1]); 22307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Min ROI Height: %d", mPanelInfo.mMinROIHeight); 22407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 22507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "roi_merge", strlen("roi_merge"))) { 22607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mNeedsROIMerge = atoi(tokens[1]); 22707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Needs ROI Merge: %d", mPanelInfo.mNeedsROIMerge); 22807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 22907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "dyn_fps_en", strlen("dyn_fps_en"))) { 23007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mDynFpsSupported = atoi(tokens[1]); 23107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Dynamic Fps: %s", mPanelInfo.mDynFpsSupported ? 23207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "Enabled" : "Disabled"); 23307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 23407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "min_fps", strlen("min_fps"))) { 23507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mMinFps = atoi(tokens[1]); 23607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Min Panel fps: %d", mPanelInfo.mMinFps); 23707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 23807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "max_fps", strlen("max_fps"))) { 23907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mMaxFps = atoi(tokens[1]); 24007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("Max Panel fps: %d", mPanelInfo.mMaxFps); 24107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 24207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 24307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 24407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((property_get("persist.hwc.pubypass", property, 0) > 0) && 24507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 24607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 24707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mPanelInfo.mPartialUpdateEnable = 0; 24807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI("PartialUpdate disabled by property"); 24907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 25007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fclose(panelInfoNodeFP); 25107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 25207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Failed to open msm_fb_panel_info node"); 25307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 25407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 25507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 25607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// This function reads the sysfs node to read MDP capabilities 25707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// and parses and updates information accordingly. 25807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::updateSysFsInfo() { 25907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani FILE *sysfsFd; 26007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani size_t len = PAGE_SIZE; 26107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ssize_t read; 26207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *line = NULL; 26307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char sysfsPath[255]; 26407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani memset(sysfsPath, 0, sizeof(sysfsPath)); 26507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(sysfsPath , sizeof(sysfsPath), 26607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "/sys/class/graphics/fb0/mdp/caps"); 26707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char property[PROPERTY_VALUE_MAX]; 26807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool enableMacroTile = false; 26907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 27007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((property_get("persist.hwc.macro_tile_enable", property, NULL) > 0) && 27107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 27207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 27307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani enableMacroTile = true; 27407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 27507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 27607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani sysfsFd = fopen(sysfsPath, "rb"); 27707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 27807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if (sysfsFd == NULL) { 27907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("%s: sysFsFile file '%s' not found", 28007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani __FUNCTION__, sysfsPath); 28107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return false; 28207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 28307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani line = (char *) malloc(len); 28407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani while((read = getline(&line, &len, sysfsFd)) != -1) { 28507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int index=0; 28607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *tokens[10]; 28707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani memset(tokens, 0, sizeof(tokens)); 28807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 28907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // parse the line and update information accordingly 29007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!tokenizeParams(line, TOKEN_PARAMS_DELIM, tokens, &index)) { 29107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[0], "hw_rev", strlen("hw_rev"))) { 29207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev = atoi(tokens[1]); 29307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 29407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(!strncmp(tokens[0], "rgb_pipes", strlen("rgb_pipes"))) { 29507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRGBPipes = (uint8_t)atoi(tokens[1]); 29607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 29707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(!strncmp(tokens[0], "vig_pipes", strlen("vig_pipes"))) { 29807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mVGPipes = (uint8_t)atoi(tokens[1]); 29907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 30007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(!strncmp(tokens[0], "dma_pipes", strlen("dma_pipes"))) { 30107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mDMAPipes = (uint8_t)atoi(tokens[1]); 30207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 30307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(!strncmp(tokens[0], "max_downscale_ratio", 30407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("max_downscale_ratio"))) { 30507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPDownscale = atoi(tokens[1]); 30607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 30707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani else if(!strncmp(tokens[0], "max_upscale_ratio", 30807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("max_upscale_ratio"))) { 30907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMDPUpscale = atoi(tokens[1]); 31007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[0], "max_bandwidth_low", 31107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("max_bandwidth_low"))) { 31207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mLowBw = atol(tokens[1]); 31307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[0], "max_bandwidth_high", 31407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("max_bandwidth_high"))) { 31507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mHighBw = atol(tokens[1]); 31607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[0], "max_mixer_width", 31707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("max_mixer_width"))) { 31807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMaxMixerWidth = atoi(tokens[1]); 31907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[0], "features", strlen("features"))) { 32007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani for(int i=1; i<index;i++) { 32107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(tokens[i], "bwc", strlen("bwc"))) { 32207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mFeatures |= MDP_BWC_EN; 32307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[i], "decimation", 32407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("decimation"))) { 32507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mFeatures |= MDP_DECIMATION_EN; 32607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[i], "tile_format", 32707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("tile_format"))) { 32807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(enableMacroTile) 32907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMacroTileEnabled = true; 33007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[i], "src_split", 33107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("src_split"))) { 33207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSourceSplit = true; 33307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[i], "non_scalar_rgb", 33407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("non_scalar_rgb"))) { 33507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRGBHasNoScalar = true; 33607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else if(!strncmp(tokens[i], "rotator_downscale", 33707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("rotator_downscale"))) { 33807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRotDownscale = true; 33907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani free(line); 34507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fclose(sysfsFd); 34607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 34707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 34807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(mMDPVersion >= qdutils::MDP_V4_2 and mMDPVersion < qdutils::MDSS_V5) { 34907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRotDownscale = true; 35007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 35107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 35207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(mSourceSplit) { 35307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani memset(sysfsPath, 0, sizeof(sysfsPath)); 35407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani snprintf(sysfsPath , sizeof(sysfsPath), 35507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "/sys/class/graphics/fb0/msm_fb_src_split_info"); 35607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 35707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani sysfsFd = fopen(sysfsPath, "rb"); 35807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if (sysfsFd == NULL) { 35907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("%s: Opening file %s failed with error %s", __FUNCTION__, 36007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani sysfsPath, strerror(errno)); 36107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return false; 36207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 36307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani line = (char *) malloc(len); 36407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if((read = getline(&line, &len, sysfsFd)) != -1) { 36507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(!strncmp(line, "src_split_always", 36607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani strlen("src_split_always"))) { 36707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSourceSplitAlways = true; 36807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 36907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 37007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani free(line); 37107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fclose(sysfsFd); 37207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 37307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 37407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 37507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGD_IF(DEBUG, "%s: mMDPVersion: %d mMdpRev: %x mRGBPipes:%d," 37607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani "mVGPipes:%d", __FUNCTION__, mMDPVersion, mMdpRev, 37707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mRGBPipes, mVGPipes); 37807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGD_IF(DEBUG, "%s:mDMAPipes:%d \t mMDPDownscale:%d, mFeatures:%d", 37907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani __FUNCTION__, mDMAPipes, mMDPDownscale, mFeatures); 38007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGD_IF(DEBUG, "%s:mLowBw: %lu mHighBw: %lu", __FUNCTION__, mLowBw, 38107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mHighBw); 38207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 38307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return true; 38407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 38507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 38607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// This function reads the sysfs node to read MDP capabilities 38707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// and parses and updates information accordingly. 38807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::updateSplitInfo() { 38907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(mMDPVersion >= MDSS_V5) { 39007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char split[64] = {0}; 39107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani FILE* fp = fopen("/sys/class/graphics/fb0/msm_fb_split", "r"); 39207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fp){ 39307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Format "left right" space as delimiter 39407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fread(split, sizeof(char), 64, fp)) { 39507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani split[sizeof(split) - 1] = '\0'; 39607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSplit.mLeft = atoi(split); 39707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI_IF(mSplit.mLeft, "Left Split=%d", mSplit.mLeft); 39807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani char *rght = strpbrk(split, " "); 39907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(rght) 40007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mSplit.mRight = atoi(rght + 1); 40107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGI_IF(mSplit.mRight, "Right Split=%d", mSplit.mRight); 40207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 40307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } else { 40407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ALOGE("Failed to open mdss_fb_split node"); 40507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return false; 40607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 40707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani if(fp) 40807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani fclose(fp); 40907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 41007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return true; 41107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 41207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 41307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 41407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::hasMinCropWidthLimitation() const { 41507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mMdpRev <= MDSS_MDP_HW_REV_102; 41607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 41707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 41807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::supportsDecimation() { 41907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mFeatures & MDP_DECIMATION_EN; 42007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 42107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 42207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniuint32_t MDPVersion::getMaxMDPDownscale() { 42307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mMDPDownscale; 42407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 42507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 42607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniuint32_t MDPVersion::getMaxMDPUpscale() { 42707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mMDPUpscale; 42807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 42907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 43007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::supportsBWC() { 43107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // BWC - Bandwidth Compression 43207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mFeatures & MDP_BWC_EN); 43307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 43407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 43507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::supportsMacroTile() { 43607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // MACRO TILE support 43707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mMacroTileEnabled; 43807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 43907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 44007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::isSrcSplit() const { 44107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mSourceSplit; 44207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 44307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 44407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::isSrcSplitAlways() const { 44507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return mSourceSplitAlways; 44607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 44707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 44807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::isRGBScalarSupported() const { 44907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (!mRGBHasNoScalar); 45007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 45107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 45207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8x26() { 45307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_101 and 45407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_102); 45507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 45607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 45707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8x74v2() { 45807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_102 and 45907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_103); 46007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 46107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 46207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8084() { 46307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_103 and 46407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_104); 46507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 46607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 46707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8092() { 46807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_200 and 46907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_206); 47007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 47107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 47207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8994() { 47307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_105 and 47407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_106); 47507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 47607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 47707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8x16() { 47807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_106 and 47907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_107); 48007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 48107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 48207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool MDPVersion::is8x39() { 48307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (mMdpRev >= MDSS_MDP_HW_REV_108 and 48407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani mMdpRev < MDSS_MDP_HW_REV_109); 48507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 48607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 48707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 48807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; //namespace qdutils 48907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 490