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_0_5  = 305,
52     MDP_V3_1    = 310,
53     MDP_V4_0    = 400,
54     MDP_V4_1    = 410,
55     MDP_V4_2    = 420,
56     MDP_V4_3    = 430,
57     MDP_V4_4    = 440,
58     MDSS_V5     = 500,
59 };
60 
61 #define NO_PANEL         '0'
62 #define MDDI_PANEL       '1'
63 #define EBI2_PANEL       '2'
64 #define LCDC_PANEL       '3'
65 #define EXT_MDDI_PANEL   '4'
66 #define TV_PANEL         '5'
67 #define DTV_PANEL        '7'
68 #define MIPI_VIDEO_PANEL '8'
69 #define MIPI_CMD_PANEL   '9'
70 #define WRITEBACK_PANEL  'a'
71 #define LVDS_PANEL       'b'
72 #define EDP_PANEL        'c'
73 
74 class MDPVersion;
75 
76 struct Split {
77     int mLeft;
78     int mRight;
SplitSplit79     Split() : mLeft(0), mRight(0){}
leftSplit80     int left() { return mLeft; }
rightSplit81     int right() { return mRight; }
82     friend class MDPVersion;
83 };
84 
85 struct PanelInfo {
86     char mType;                  // Smart or Dumb
87     int mPartialUpdateEnable;    // Partial update feature
88     int mLeftAlign;              // ROI left alignment restriction
89     int mWidthAlign;             // ROI width alignment restriction
90     int mTopAlign;               // ROI top alignment restriction
91     int mHeightAlign;            // ROI height alignment restriction
92     int mMinROIWidth;            // Min width needed for ROI
93     int mMinROIHeight;           // Min height needed for ROI
94     bool mNeedsROIMerge;         // Merge ROI's of both the DSI's
95     bool mDynFpsSupported;       // Panel Supports dyn fps
96     uint32_t mMinFps;            // Min fps supported by panel
97     uint32_t mMaxFps;            // Max fps supported by panel
PanelInfoPanelInfo98     PanelInfo() : mType(NO_PANEL), mPartialUpdateEnable(0),
99     mLeftAlign(0), mWidthAlign(0), mTopAlign(0), mHeightAlign(0),
100     mMinROIWidth(0), mMinROIHeight(0), mNeedsROIMerge(false),
101     mDynFpsSupported(0), mMinFps(0), mMaxFps(0) {}
102     friend class MDPVersion;
103 };
104 
105 class MDPVersion : public Singleton <MDPVersion>
106 {
107 public:
108     MDPVersion();
109     ~MDPVersion();
getMDPVersion()110     int getMDPVersion() {return mMDPVersion;}
getPanelType()111     char getPanelType() {return mPanelInfo.mType;}
hasOverlay()112     bool hasOverlay() {return mHasOverlay;}
getTotalPipes()113     uint8_t getTotalPipes() {
114         return (uint8_t)(mRGBPipes + mVGPipes + mDMAPipes);
115     }
getRGBPipes()116     uint8_t getRGBPipes() { return mRGBPipes; }
getVGPipes()117     uint8_t getVGPipes() { return mVGPipes; }
getDMAPipes()118     uint8_t getDMAPipes() { return mDMAPipes; }
getBlendStages()119     uint8_t getBlendStages() { return mBlendStages; }
120     bool supportsDecimation();
121     uint32_t getMaxMDPDownscale();
122     uint32_t getMaxMDPUpscale();
123     bool supportsBWC();
124     bool supportsMacroTile();
getLeftSplit()125     int getLeftSplit() { return mSplit.left(); }
getRightSplit()126     int getRightSplit() { return mSplit.right(); }
isPartialUpdateEnabled()127     bool isPartialUpdateEnabled() { return mPanelInfo.mPartialUpdateEnable; }
getLeftAlign()128     int getLeftAlign() { return mPanelInfo.mLeftAlign; }
getWidthAlign()129     int getWidthAlign() { return mPanelInfo.mWidthAlign; }
getTopAlign()130     int getTopAlign() { return mPanelInfo.mTopAlign; }
getHeightAlign()131     int getHeightAlign() { return mPanelInfo.mHeightAlign; }
getMinROIWidth()132     int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
getMinROIHeight()133     int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
needsROIMerge()134     bool needsROIMerge() { return mPanelInfo.mNeedsROIMerge; }
getLowBw()135     unsigned long getLowBw() { return mLowBw; }
getHighBw()136     unsigned long getHighBw() { return mHighBw; }
isRotDownscaleEnabled()137     bool isRotDownscaleEnabled() { return mRotDownscale; }
isDynFpsSupported()138     bool isDynFpsSupported() { return mPanelInfo.mDynFpsSupported; }
getMinFpsSupported()139     uint32_t getMinFpsSupported() { return mPanelInfo.mMinFps; }
getMaxFpsSupported()140     uint32_t getMaxFpsSupported() { return mPanelInfo.mMaxFps; }
getMaxMixerWidth()141     uint32_t getMaxMixerWidth() const { return mMaxMixerWidth; }
getMaxPipeWidth()142     uint32_t getMaxPipeWidth() const { return mMaxPipeWidth; }
143     bool hasMinCropWidthLimitation() const;
144     bool isSrcSplit() const;
145     bool isSrcSplitAlways() const;
146     bool isRGBScalarSupported() const;
147     bool is8x26();
148     bool is8x74v2();
149     bool is8084();
150     bool is8092();
151     bool is8994();
152     bool is8x16();
153     bool is8x39();
154 
155 private:
156     bool updateSysFsInfo();
157     void updatePanelInfo();
158     bool updateSplitInfo();
159     int tokenizeParams(char *inputParams, const char *delim,
160                         char* tokenStr[], int *idx);
161     int mFd;
162     int mMDPVersion;
163     bool mHasOverlay;
164     uint32_t mMdpRev;
165     uint8_t mRGBPipes;
166     uint8_t mVGPipes;
167     uint8_t mDMAPipes;
168     uint8_t mBlendStages;
169     uint32_t mFeatures;
170     uint32_t mMDPDownscale;
171     uint32_t mMDPUpscale;
172     bool mMacroTileEnabled;
173     Split mSplit;
174     PanelInfo mPanelInfo;
175     unsigned long mLowBw; //kbps
176     unsigned long mHighBw; //kbps
177     bool mSourceSplit;
178     //Additional property on top of source split
179     bool mSourceSplitAlways;
180     bool mRGBHasNoScalar;
181     bool mRotDownscale;
182     uint32_t mMaxMixerWidth; //maximum x-res of a given mdss mixer.
183     uint32_t mMaxPipeWidth; //maximum x-res of the mdp pipe.
184 };
185 }; //namespace qdutils
186 #endif //INCLUDE_LIBQCOMUTILS_MDPVER
187