1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Redistribution and use in source and binary forms, with or without
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * modification, are permitted provided that the following conditions are
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * met:
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *   * Redistributions of source code must retain the above copyright
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     notice, this list of conditions and the following disclaimer.
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *   * Redistributions in binary form must reproduce the above
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     copyright notice, this list of conditions and the following
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     disclaimer in the documentation and/or other materials provided
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     with the distribution.
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *   * Neither the name of The Linux Foundation nor the names of its
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     contributors may be used to endorse or promote products derived
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     from this software without specific prior written permission.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef INCLUDE_LIBQCOMUTILS_MDPVER
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define INCLUDE_LIBQCOMUTILS_MDPVER
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdint.h>
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Singleton.h>
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/properties.h>
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* This class gets the MSM type from the soc info
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace android;
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qdutils {
41a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// These panel definitions are available at mdss_mdp.h which is internal header
42a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// file and is not available at <linux/mdss_mdp.h>.
43a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// ToDo: once it is available at linux/mdss_mdp.h, these below definitions can
44a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// be removed.
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum mdp_version {
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V_UNKNOWN = 0,
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V2_2    = 220,
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V3_0    = 300,
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V3_0_3  = 303,
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V3_0_4  = 304,
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V3_1    = 310,
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V4_0    = 400,
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V4_1    = 410,
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V4_2    = 420,
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V4_3    = 430,
56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDP_V4_4    = 440,
57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDSS_V5     = 500,
58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
60a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// chip variants have same major number and minor numbers usually vary
61a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// for e.g., MDSS_MDP_HW_REV_101 is 0x10010000
62a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//                                    1001       -  major number
63a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//                                        0000   -  minor number
64a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// 8x26 v1 minor number is 0000
65a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//      v2 minor number is 0001 etc..
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum {
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MAX_DISPLAY_DIM = 2048,
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
71a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#define NO_PANEL         '0'
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MDDI_PANEL       '1'
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define EBI2_PANEL       '2'
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define LCDC_PANEL       '3'
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define EXT_MDDI_PANEL   '4'
76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define TV_PANEL         '5'
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define DTV_PANEL        '7'
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MIPI_VIDEO_PANEL '8'
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MIPI_CMD_PANEL   '9'
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define WRITEBACK_PANEL  'a'
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define LVDS_PANEL       'b'
82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#define EDP_PANEL        'c'
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MDPVersion;
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct Split {
87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mLeft;
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mRight;
89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Split() : mLeft(0), mRight(0){}
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int left() { return mLeft; }
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int right() { return mRight; }
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    friend class MDPVersion;
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
95962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaranstruct PanelInfo {
96962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    char mType;                  // Smart or Dumb
97962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int mPartialUpdateEnable;    // Partial update feature
98962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int mLeftAlign;              // ROI left alignment restriction
99962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int mWidthAlign;             // ROI width alignment restriction
100962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int mTopAlign;               // ROI top alignment restriction
101962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int mHeightAlign;            // ROI height alignment restriction
10229e3491d8c71a426903f0194a9a40a75bde825b3Jeykumar Sankaran    int mMinROIWidth;            // Min width needed for ROI
10329e3491d8c71a426903f0194a9a40a75bde825b3Jeykumar Sankaran    int mMinROIHeight;           // Min height needed for ROI
104514cb6b3f43dd8a3d743cbe68f333898d5e981b8Jeykumar Sankaran    bool mNeedsROIMerge;         // Merge ROI's of both the DSI's
105962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    PanelInfo() : mType(NO_PANEL), mPartialUpdateEnable(0),
10629e3491d8c71a426903f0194a9a40a75bde825b3Jeykumar Sankaran    mLeftAlign(0), mWidthAlign(0), mTopAlign(0), mHeightAlign(0),
107514cb6b3f43dd8a3d743cbe68f333898d5e981b8Jeykumar Sankaran    mMinROIWidth(0), mMinROIHeight(0), mNeedsROIMerge(false){}
108962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    friend class MDPVersion;
109962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran};
110962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran
111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MDPVersion : public Singleton <MDPVersion>
112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MDPVersion();
115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~MDPVersion();
116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getMDPVersion() {return mMDPVersion;}
117962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    char getPanelType() {return mPanelInfo.mType;}
118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool hasOverlay() {return mHasOverlay;}
119a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    uint8_t getTotalPipes() {
120a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return (uint8_t)(mRGBPipes + mVGPipes + mDMAPipes);
121a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t getRGBPipes() { return mRGBPipes; }
123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t getVGPipes() { return mVGPipes; }
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t getDMAPipes() { return mDMAPipes; }
125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool supportsDecimation();
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t getMaxMDPDownscale();
127a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    uint32_t getMaxMDPUpscale();
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool supportsBWC();
129a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool supportsMacroTile();
130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getLeftSplit() { return mSplit.left(); }
131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int getRightSplit() { return mSplit.right(); }
1326f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    bool isPartialUpdateEnabled() { return mPanelInfo.mPartialUpdateEnable; }
133962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int getLeftAlign() { return mPanelInfo.mLeftAlign; }
134962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int getWidthAlign() { return mPanelInfo.mWidthAlign; }
135962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int getTopAlign() { return mPanelInfo.mTopAlign; }
136962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    int getHeightAlign() { return mPanelInfo.mHeightAlign; }
13729e3491d8c71a426903f0194a9a40a75bde825b3Jeykumar Sankaran    int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
13829e3491d8c71a426903f0194a9a40a75bde825b3Jeykumar Sankaran    int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
139514cb6b3f43dd8a3d743cbe68f333898d5e981b8Jeykumar Sankaran    bool needsROIMerge() { return mPanelInfo.mNeedsROIMerge; }
140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    unsigned long getLowBw() { return mLowBw; }
141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    unsigned long getHighBw() { return mHighBw; }
142afb0630fd38b3db0e01f243d3112d0b67a93976eSaurabh Shah    bool isRotDownscaleEnabled() { return mRotDownscale; }
143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool isSrcSplit() const;
144e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah    bool isSrcSplitAlways() const;
1450fdae193307fb17bb537598ab62682edd5138b72radhakrishna    bool isRGBScalarSupported() const;
146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool is8x26();
147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool is8x74v2();
148a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool is8084();
149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool is8092();
15052c40f737665f00bf9ecd486b9896ce256c94fd2Saurabh Shah    bool is8994();
1510fdae193307fb17bb537598ab62682edd5138b72radhakrishna    bool is8x16();
15226ca824f5a1e6adb8038a103c27139c163bb0660Prabhanjan Kandula    bool is8x39();
153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool updateSysFsInfo();
156962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    void updatePanelInfo();
157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool updateSplitInfo();
158a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int tokenizeParams(char *inputParams, const char *delim,
159a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                        char* tokenStr[], int *idx);
160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mFd;
161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mMDPVersion;
162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool mHasOverlay;
163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mMdpRev;
164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t mRGBPipes;
165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t mVGPipes;
166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint8_t mDMAPipes;
167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mFeatures;
168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    uint32_t mMDPDownscale;
169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    uint32_t mMDPUpscale;
170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool mMacroTileEnabled;
171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Split mSplit;
172962c5d172ef0503585834d4bb037a856dd74bb7fJeykumar Sankaran    PanelInfo mPanelInfo;
173a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    unsigned long mLowBw; //kbps
174a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    unsigned long mHighBw; //kbps
175a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool mSourceSplit;
176e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah    //Additional property on top of source split
177e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah    bool mSourceSplitAlways;
1780fdae193307fb17bb537598ab62682edd5138b72radhakrishna    bool mRGBHasNoScalar;
179afb0630fd38b3db0e01f243d3112d0b67a93976eSaurabh Shah    bool mRotDownscale;
180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; //namespace qdutils
182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif //INCLUDE_LIBQCOMUTILS_MDPVER
183