Home | History | Annotate | Download | only in libqdutils
      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;
     79     Split() : mLeft(0), mRight(0){}
     80     int left() { return mLeft; }
     81     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
     98     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();
    110     int getMDPVersion() {return mMDPVersion;}
    111     char getPanelType() {return mPanelInfo.mType;}
    112     bool hasOverlay() {return mHasOverlay;}
    113     uint8_t getTotalPipes() {
    114         return (uint8_t)(mRGBPipes + mVGPipes + mDMAPipes);
    115     }
    116     uint8_t getRGBPipes() { return mRGBPipes; }
    117     uint8_t getVGPipes() { return mVGPipes; }
    118     uint8_t getDMAPipes() { return mDMAPipes; }
    119     uint8_t getBlendStages() { return mBlendStages; }
    120     bool supportsDecimation();
    121     uint32_t getMaxMDPDownscale();
    122     uint32_t getMaxMDPUpscale();
    123     bool supportsBWC();
    124     bool supportsMacroTile();
    125     int getLeftSplit() { return mSplit.left(); }
    126     int getRightSplit() { return mSplit.right(); }
    127     bool isPartialUpdateEnabled() { return mPanelInfo.mPartialUpdateEnable; }
    128     int getLeftAlign() { return mPanelInfo.mLeftAlign; }
    129     int getWidthAlign() { return mPanelInfo.mWidthAlign; }
    130     int getTopAlign() { return mPanelInfo.mTopAlign; }
    131     int getHeightAlign() { return mPanelInfo.mHeightAlign; }
    132     int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
    133     int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
    134     bool needsROIMerge() { return mPanelInfo.mNeedsROIMerge; }
    135     unsigned long getLowBw() { return mLowBw; }
    136     unsigned long getHighBw() { return mHighBw; }
    137     bool isRotDownscaleEnabled() { return mRotDownscale; }
    138     bool isDynFpsSupported() { return mPanelInfo.mDynFpsSupported; }
    139     uint32_t getMinFpsSupported() { return mPanelInfo.mMinFps; }
    140     uint32_t getMaxFpsSupported() { return mPanelInfo.mMaxFps; }
    141     uint32_t getMaxMixerWidth() const { return mMaxMixerWidth; }
    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