mdp_version.cpp revision c1607973c2d29f7f5bf00ce1be4914e13215f933
1/* 2 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 3 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29#include <cutils/log.h> 30#include <fcntl.h> 31#include <sys/ioctl.h> 32#include <linux/fb.h> 33#include <linux/msm_mdp.h> 34#include "mdp_version.h" 35 36ANDROID_SINGLETON_STATIC_INSTANCE(qdutils::MDPVersion); 37namespace qdutils { 38 39MDPVersion::MDPVersion() 40{ 41 int fb_fd = open("/dev/graphics/fb0", O_RDWR); 42 int mdp_version = MDP_V_UNKNOWN; 43 char panel_type = 0; 44 struct fb_fix_screeninfo fb_finfo; 45 46 mMdpRev = 0; 47 mRGBPipes = 0; 48 mVGPipes = 0; 49 mDMAPipes = 0; 50 mFeatures = 0; 51 //TODO get this from driver, default for A-fam to 8 52 mMDPDownscale = 8; 53 54 if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &fb_finfo) < 0) { 55 ALOGE("FBIOGET_FSCREENINFO failed"); 56 mdp_version = MDP_V_UNKNOWN; 57 } else { 58 if(!strncmp(fb_finfo.id, "msmfb", 5)) { 59 char str_ver[4] = { 0 }; 60 memcpy(str_ver, &fb_finfo.id[5], 3); 61 str_ver[3] = '\0'; 62 mdp_version = atoi(str_ver); 63 64 //Normalize MDP version to ease comparison. 65 //This is needed only because 66 //MDP 3.0.3 reports value as 303 which 67 //is more than all the others 68 if (mdp_version < 100) 69 mdp_version *= 10; 70 71 mRGBPipes = mVGPipes = 2; 72 73 } else if (!strncmp(fb_finfo.id, "mdssfb", 6)) { 74 mdp_version = MDSS_V5; 75#ifdef MDSS_TARGET 76 struct msmfb_metadata metadata; 77 memset(&metadata, 0 , sizeof(metadata)); 78 metadata.op = metadata_op_get_caps; 79 if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) { 80 ALOGE("Error retrieving MDP revision and pipes info"); 81 mdp_version = MDP_V_UNKNOWN; 82 } else { 83 mMdpRev = metadata.data.caps.mdp_rev; 84 mRGBPipes = metadata.data.caps.rgb_pipes; 85 mVGPipes = metadata.data.caps.vig_pipes; 86 mDMAPipes = metadata.data.caps.dma_pipes; 87 mFeatures = metadata.data.caps.features; 88 if (metadata.data.caps.mdp_rev == MDP_V3_0_4){ 89 mdp_version = MDP_V3_0_4; 90 } 91 } 92#endif 93 } else { 94 mdp_version = MDP_V_UNKNOWN; 95 } 96 97 /* Assumes panel type is 2nd element in '_' delimited id string */ 98 char * ptype = strstr(fb_finfo.id, "_"); 99 if (!ptype || (*(++ptype) == '\0')) { 100 ALOGE("Invalid framebuffer info string: %s", fb_finfo.id); 101 ptype = fb_finfo.id; 102 } 103 panel_type = *ptype; 104 105 } 106 close(fb_fd); 107 mMDPVersion = mdp_version; 108 mHasOverlay = false; 109 if((mMDPVersion >= MDP_V4_0) || 110 (mMDPVersion == MDP_V_UNKNOWN) || 111 (mMDPVersion == MDP_V3_0_4)) 112 mHasOverlay = true; 113 if(mMDPVersion >= MDSS_V5) { 114 //TODO get this from driver 115 mMDPDownscale = 4; 116 } 117 118 mPanelType = panel_type; 119} 120 121bool MDPVersion::supportsDecimation() { 122 return mFeatures & MDP_DECIMATION_EN; 123} 124 125uint32_t MDPVersion::getMaxMDPDownscale() { 126 return mMDPDownscale; 127} 128 129bool MDPVersion::supportsBWC() { 130 // BWC - Bandwidth Compression 131 return (mFeatures & MDP_BWC_EN); 132} 133 134bool MDPVersion::is8x26() { 135 // check for 8x26 variants 136 // chip variants have same major number and minor numbers usually vary 137 // for e.g., MDSS_MDP_HW_REV_101 is 0x10010000 138 // 1001 - major number 139 // 0000 - minor number 140 // 8x26 v1 minor number is 0000 141 // v2 minor number is 0001 etc.. 142 if( mMdpRev >= MDSS_MDP_HW_REV_101 && mMdpRev < MDSS_MDP_HW_REV_102) { 143 return true; 144 } 145 return false; 146} 147 148}; //namespace qdutils 149 150