• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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; }
119     bool supportsDecimation();
120     uint32_t getMaxMDPDownscale();
121     uint32_t getMaxMDPUpscale();
122     bool supportsBWC();
123     bool supportsMacroTile();
getLeftSplit()124     int getLeftSplit() { return mSplit.left(); }
getRightSplit()125     int getRightSplit() { return mSplit.right(); }
isPartialUpdateEnabled()126     bool isPartialUpdateEnabled() { return mPanelInfo.mPartialUpdateEnable; }
getLeftAlign()127     int getLeftAlign() { return mPanelInfo.mLeftAlign; }
getWidthAlign()128     int getWidthAlign() { return mPanelInfo.mWidthAlign; }
getTopAlign()129     int getTopAlign() { return mPanelInfo.mTopAlign; }
getHeightAlign()130     int getHeightAlign() { return mPanelInfo.mHeightAlign; }
getMinROIWidth()131     int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
getMinROIHeight()132     int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
needsROIMerge()133     bool needsROIMerge() { return mPanelInfo.mNeedsROIMerge; }
getLowBw()134     unsigned long getLowBw() { return mLowBw; }
getHighBw()135     unsigned long getHighBw() { return mHighBw; }
isRotDownscaleEnabled()136     bool isRotDownscaleEnabled() { return mRotDownscale; }
isDynFpsSupported()137     bool isDynFpsSupported() { return mPanelInfo.mDynFpsSupported; }
getMinFpsSupported()138     uint32_t getMinFpsSupported() { return mPanelInfo.mMinFps; }
getMaxFpsSupported()139     uint32_t getMaxFpsSupported() { return mPanelInfo.mMaxFps; }
getMaxMixerWidth()140     uint32_t getMaxMixerWidth() const { return mMaxMixerWidth; }
141     bool hasMinCropWidthLimitation() const;
142     bool isSrcSplit() const;
143     bool isSrcSplitAlways() const;
144     bool isRGBScalarSupported() const;
145     bool is8x26();
146     bool is8x74v2();
147     bool is8084();
148     bool is8092();
149     bool is8994();
150     bool is8x16();
151     bool is8x39();
152 
153 private:
154     bool updateSysFsInfo();
155     void updatePanelInfo();
156     bool updateSplitInfo();
157     int tokenizeParams(char *inputParams, const char *delim,
158                         char* tokenStr[], int *idx);
159     int mFd;
160     int mMDPVersion;
161     bool mHasOverlay;
162     uint32_t mMdpRev;
163     uint8_t mRGBPipes;
164     uint8_t mVGPipes;
165     uint8_t mDMAPipes;
166     uint32_t mFeatures;
167     uint32_t mMDPDownscale;
168     uint32_t mMDPUpscale;
169     bool mMacroTileEnabled;
170     Split mSplit;
171     PanelInfo mPanelInfo;
172     unsigned long mLowBw; //kbps
173     unsigned long mHighBw; //kbps
174     bool mSourceSplit;
175     //Additional property on top of source split
176     bool mSourceSplitAlways;
177     bool mRGBHasNoScalar;
178     bool mRotDownscale;
179     uint32_t mMaxMixerWidth; //maximum x-res of a given mdss mixer.
180 };
181 }; //namespace qdutils
182 #endif //INCLUDE_LIBQCOMUTILS_MDPVER
183