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 
30 #ifndef INCLUDE_LIBQCOMUTILS_MDPVER
31 #define INCLUDE_LIBQCOMUTILS_MDPVER
32 
33 #include <stdint.h>
34 #include <utils/Singleton.h>
35 #include <cutils/properties.h>
36 
37 /* This class gets the MSM type from the soc info
38 */
39 using namespace android;
40 namespace qdutils {
41 // These panel definitions are available at mdss_mdp.h which is internal header
42 // file and is not available at <linux/mdss_mdp.h>.
43 // ToDo: once it is available at linux/mdss_mdp.h, these below definitions can
44 // be removed.
45 enum mdp_version {
46     MDP_V_UNKNOWN = 0,
47     MDP_V2_2    = 220,
48     MDP_V3_0    = 300,
49     MDP_V3_0_3  = 303,
50     MDP_V3_0_4  = 304,
51     MDP_V3_1    = 310,
52     MDP_V4_0    = 400,
53     MDP_V4_1    = 410,
54     MDP_V4_2    = 420,
55     MDP_V4_3    = 430,
56     MDP_V4_4    = 440,
57     MDSS_V5     = 500,
58 };
59 
60 // chip variants have same major number and minor numbers usually vary
61 // for e.g., MDSS_MDP_HW_REV_101 is 0x10010000
62 //                                    1001       -  major number
63 //                                        0000   -  minor number
64 // 8x26 v1 minor number is 0000
65 //      v2 minor number is 0001 etc..
66 
67 enum {
68     MAX_DISPLAY_DIM = 2048,
69 };
70 
71 #define NO_PANEL         '0'
72 #define MDDI_PANEL       '1'
73 #define EBI2_PANEL       '2'
74 #define LCDC_PANEL       '3'
75 #define EXT_MDDI_PANEL   '4'
76 #define TV_PANEL         '5'
77 #define DTV_PANEL        '7'
78 #define MIPI_VIDEO_PANEL '8'
79 #define MIPI_CMD_PANEL   '9'
80 #define WRITEBACK_PANEL  'a'
81 #define LVDS_PANEL       'b'
82 #define EDP_PANEL        'c'
83 
84 class MDPVersion;
85 
86 struct Split {
87     int mLeft;
88     int mRight;
SplitSplit89     Split() : mLeft(0), mRight(0){}
leftSplit90     int left() { return mLeft; }
rightSplit91     int right() { return mRight; }
92     friend class MDPVersion;
93 };
94 
95 struct PanelInfo {
96     char mType;                  // Smart or Dumb
97     int mPartialUpdateEnable;    // Partial update feature
98     int mLeftAlign;              // ROI left alignment restriction
99     int mWidthAlign;             // ROI width alignment restriction
100     int mTopAlign;               // ROI top alignment restriction
101     int mHeightAlign;            // ROI height alignment restriction
102     int mMinROIWidth;            // Min width needed for ROI
103     int mMinROIHeight;           // Min height needed for ROI
104     bool mNeedsROIMerge;         // Merge ROI's of both the DSI's
PanelInfoPanelInfo105     PanelInfo() : mType(NO_PANEL), mPartialUpdateEnable(0),
106     mLeftAlign(0), mWidthAlign(0), mTopAlign(0), mHeightAlign(0),
107     mMinROIWidth(0), mMinROIHeight(0), mNeedsROIMerge(false){}
108     friend class MDPVersion;
109 };
110 
111 class MDPVersion : public Singleton <MDPVersion>
112 {
113 public:
114     MDPVersion();
115     ~MDPVersion();
getMDPVersion()116     int getMDPVersion() {return mMDPVersion;}
getPanelType()117     char getPanelType() {return mPanelInfo.mType;}
hasOverlay()118     bool hasOverlay() {return mHasOverlay;}
getTotalPipes()119     uint8_t getTotalPipes() {
120         return (uint8_t)(mRGBPipes + mVGPipes + mDMAPipes);
121     }
getRGBPipes()122     uint8_t getRGBPipes() { return mRGBPipes; }
getVGPipes()123     uint8_t getVGPipes() { return mVGPipes; }
getDMAPipes()124     uint8_t getDMAPipes() { return mDMAPipes; }
125     bool supportsDecimation();
126     uint32_t getMaxMDPDownscale();
127     uint32_t getMaxMDPUpscale();
128     bool supportsBWC();
129     bool supportsMacroTile();
getLeftSplit()130     int getLeftSplit() { return mSplit.left(); }
getRightSplit()131     int getRightSplit() { return mSplit.right(); }
isPartialUpdateEnabled()132     bool isPartialUpdateEnabled() { return mPanelInfo.mPartialUpdateEnable; }
getLeftAlign()133     int getLeftAlign() { return mPanelInfo.mLeftAlign; }
getWidthAlign()134     int getWidthAlign() { return mPanelInfo.mWidthAlign; }
getTopAlign()135     int getTopAlign() { return mPanelInfo.mTopAlign; }
getHeightAlign()136     int getHeightAlign() { return mPanelInfo.mHeightAlign; }
getMinROIWidth()137     int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
getMinROIHeight()138     int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
needsROIMerge()139     bool needsROIMerge() { return mPanelInfo.mNeedsROIMerge; }
getLowBw()140     unsigned long getLowBw() { return mLowBw; }
getHighBw()141     unsigned long getHighBw() { return mHighBw; }
142     bool hasMinCropWidthLimitation() const;
143     bool isSrcSplit() const;
144     bool isSrcSplitAlways() const;
145     bool isRGBScalarSupported() const;
146     bool is8x26();
147     bool is8x74v2();
148     bool is8084();
149     bool is8092();
150     bool is8x16();
151 
152 private:
153     bool updateSysFsInfo();
154     void updatePanelInfo();
155     bool updateSplitInfo();
156     int tokenizeParams(char *inputParams, const char *delim,
157                         char* tokenStr[], int *idx);
158     int mFd;
159     int mMDPVersion;
160     bool mHasOverlay;
161     uint32_t mMdpRev;
162     uint8_t mRGBPipes;
163     uint8_t mVGPipes;
164     uint8_t mDMAPipes;
165     uint32_t mFeatures;
166     uint32_t mMDPDownscale;
167     uint32_t mMDPUpscale;
168     bool mMacroTileEnabled;
169     Split mSplit;
170     PanelInfo mPanelInfo;
171     unsigned long mLowBw; //kbps
172     unsigned long mHighBw; //kbps
173     bool mSourceSplit;
174     //Additional property on top of source split
175     bool mSourceSplitAlways;
176     bool mRGBHasNoScalar;
177 };
178 }; //namespace qdutils
179 #endif //INCLUDE_LIBQCOMUTILS_MDPVER
180