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