129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Redistribution and use in source and binary forms, with or without 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * modification, are permitted provided that the following conditions are 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * met: 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * * Redistributions of source code must retain the above copyright 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * notice, this list of conditions and the following disclaimer. 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * * Redistributions in binary form must reproduce the above 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * copyright notice, this list of conditions and the following 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * disclaimer in the documentation and/or other materials provided 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * with the distribution. 13a43fb8fce6d9be5577de1e0f49c99bd4fe2f6d44Duy Truong * * Neither the name of The Linux Foundation nor the names of its 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * contributors may be used to endorse or promote products derived 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * from this software without specific prior written permission. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 29a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#include <cutils/log.h> 30a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#include <fcntl.h> 3144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah#include <sys/ioctl.h> 32a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#include <linux/fb.h> 3344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah#include <linux/msm_mdp.h> 34a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#include "mdp_version.h" 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 36a87da60090f55b823ee999930b381daa3dbda67eNaseer AhmedANDROID_SINGLETON_STATIC_INSTANCE(qdutils::MDPVersion); 37a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmednamespace qdutils { 3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3996c4c95d48dc075196c601b30a8798a262df9720Naseer AhmedMDPVersion::MDPVersion() 40a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed{ 41a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed int fb_fd = open("/dev/graphics/fb0", O_RDWR); 42a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed int mdp_version = MDP_V_UNKNOWN; 4396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed char panel_type = 0; 44a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed struct fb_fix_screeninfo fb_finfo; 4544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah 4644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mMdpRev = 0; 47ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mRGBPipes = 0; 48ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mVGPipes = 0; 4944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mDMAPipes = 0; 50ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mFeatures = 0; 51ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah //TODO get this from driver, default for A-fam to 8 52ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mMDPDownscale = 8; 5364718efc5e715c5980c5a6abb96423414953aaccXiaoming Zhou mFd = fb_fd; 5444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah 55a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &fb_finfo) < 0) { 56a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed ALOGE("FBIOGET_FSCREENINFO failed"); 57a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mdp_version = MDP_V_UNKNOWN; 58a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed } else { 59a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed if(!strncmp(fb_finfo.id, "msmfb", 5)) { 60a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed char str_ver[4] = { 0 }; 61a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed memcpy(str_ver, &fb_finfo.id[5], 3); 62a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed str_ver[3] = '\0'; 63a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mdp_version = atoi(str_ver); 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 65a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed //Normalize MDP version to ease comparison. 66a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed //This is needed only because 67a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed //MDP 3.0.3 reports value as 303 which 68a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed //is more than all the others 69a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed if (mdp_version < 100) 70a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mdp_version *= 10; 7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 7244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mRGBPipes = mVGPipes = 2; 7344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah 74a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed } else if (!strncmp(fb_finfo.id, "mdssfb", 6)) { 75a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mdp_version = MDSS_V5; 7644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah#ifdef MDSS_TARGET 7744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah struct msmfb_metadata metadata; 7844d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah memset(&metadata, 0 , sizeof(metadata)); 7944d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah metadata.op = metadata_op_get_caps; 8044d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah if (ioctl(fb_fd, MSMFB_METADATA_GET, &metadata) == -1) { 8144d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah ALOGE("Error retrieving MDP revision and pipes info"); 8244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mdp_version = MDP_V_UNKNOWN; 8344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } else { 8444d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mMdpRev = metadata.data.caps.mdp_rev; 8544d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mRGBPipes = metadata.data.caps.rgb_pipes; 8644d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mVGPipes = metadata.data.caps.vig_pipes; 8744d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah mDMAPipes = metadata.data.caps.dma_pipes; 88ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mFeatures = metadata.data.caps.features; 896848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou if (metadata.data.caps.mdp_rev == MDP_V3_0_4){ 906848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou mdp_version = MDP_V3_0_4; 916848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou } 9244d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah } 9344d5282b252fa1db88472542c0b9d794fd915d54Saurabh Shah#endif 94a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed } else { 95a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mdp_version = MDP_V_UNKNOWN; 96a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed } 97adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip 98adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip /* Assumes panel type is 2nd element in '_' delimited id string */ 99adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip char * ptype = strstr(fb_finfo.id, "_"); 100adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip if (!ptype || (*(++ptype) == '\0')) { 101adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip ALOGE("Invalid framebuffer info string: %s", fb_finfo.id); 102adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip ptype = fb_finfo.id; 103adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip } 104adee189ad3f1f1b4e54f3d4063638c8c669a24b5Carl Vanderlip panel_type = *ptype; 105a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed } 106828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah mPanelType = panel_type; 10796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed mMDPVersion = mdp_version; 10896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed mHasOverlay = false; 1096848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou if((mMDPVersion >= MDP_V4_0) || 1106848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou (mMDPVersion == MDP_V_UNKNOWN) || 1116848f7a0d9ed6fecb0fc27c8bfa32c5fda3ab163Xiaoming Zhou (mMDPVersion == MDP_V3_0_4)) 112a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed mHasOverlay = true; 113ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah if(mMDPVersion >= MDSS_V5) { 114ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah //TODO get this from driver 115ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah mMDPDownscale = 4; 116ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah 117828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah char split[64]; 118828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah FILE* fp = fopen("/sys/class/graphics/fb0/msm_fb_split", "r"); 119828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah if(fp){ 120828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah //Format "left right" space as delimiter 121828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah if(fread(split, sizeof(char), 64, fp)) { 122828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah mSplit.mLeft = atoi(split); 123828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah ALOGI_IF(mSplit.mLeft, "Left Split=%d", mSplit.mLeft); 124828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah char *rght = strpbrk(split, " "); 125828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah if(rght) 126828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah mSplit.mRight = atoi(rght + 1); 127828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah ALOGI_IF(rght, "Right Split=%d", mSplit.mRight); 128828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah } 129828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah } else { 130828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah ALOGE("Failed to open mdss_fb_split node"); 131828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah } 132828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah 133828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah if(fp) 134828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah fclose(fp); 135828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah } 136a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed} 137ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah 13864718efc5e715c5980c5a6abb96423414953aaccXiaoming ZhouMDPVersion::~MDPVersion() { 13964718efc5e715c5980c5a6abb96423414953aaccXiaoming Zhou close(mFd); 14064718efc5e715c5980c5a6abb96423414953aaccXiaoming Zhou} 14164718efc5e715c5980c5a6abb96423414953aaccXiaoming Zhou 142ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shahbool MDPVersion::supportsDecimation() { 143ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah return mFeatures & MDP_DECIMATION_EN; 144ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah} 145ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah 146ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shahuint32_t MDPVersion::getMaxMDPDownscale() { 147ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah return mMDPDownscale; 148ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah} 149ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah 1503932d9e448c02ac953cbc0f3ef7c0573400a5570Sushil Chauhanbool MDPVersion::supportsBWC() { 1513932d9e448c02ac953cbc0f3ef7c0573400a5570Sushil Chauhan // BWC - Bandwidth Compression 1523932d9e448c02ac953cbc0f3ef7c0573400a5570Sushil Chauhan return (mFeatures & MDP_BWC_EN); 1533932d9e448c02ac953cbc0f3ef7c0573400a5570Sushil Chauhan} 15420de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah 15520de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shahbool MDPVersion::is8x26() { 156c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // check for 8x26 variants 157c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // chip variants have same major number and minor numbers usually vary 158c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // for e.g., MDSS_MDP_HW_REV_101 is 0x10010000 159c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // 1001 - major number 160c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // 0000 - minor number 161c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // 8x26 v1 minor number is 0000 162c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar // v2 minor number is 0001 etc.. 163c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar if( mMdpRev >= MDSS_MDP_HW_REV_101 && mMdpRev < MDSS_MDP_HW_REV_102) { 164c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar return true; 165c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar } 166c1607973c2d29f7f5bf00ce1be4914e13215f933Amara Venkata Mastan Manoj Kumar return false; 16720de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah} 16820de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah 169a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed}; //namespace qdutils 17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 171