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