1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
4  *
5  * Not a Contribution, Apache license notifications and license are
6  * retained for attribution purposes only.
7 
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #ifndef HWC_HDMI_DISPLAY_H
22 #define HWC_HDMI_DISPLAY_H
23 
24 #include <linux/fb.h>
25 
26 struct msm_hdmi_mode_timing_info;
27 
28 namespace qhwc {
29 
30 //Type of scanning of EDID(Video Capability Data Block)
31 enum hdmi_scansupport_type {
32     HDMI_SCAN_NOT_SUPPORTED      = 0,
33     HDMI_SCAN_ALWAYS_OVERSCANED  = 1,
34     HDMI_SCAN_ALWAYS_UNDERSCANED = 2,
35     HDMI_SCAN_BOTH_SUPPORTED     = 3
36 };
37 
38 // Structure to store EDID related data
39 struct EDIDData {
40     int mMode, mWidth, mHeight, mFps;
41     // Predetermined ordering for each mode
42     int mModeOrder;
EDIDDataEDIDData43     EDIDData(int mode, int width, int height, int fps, int order)
44     : mMode(mode), mWidth(width), mHeight(height), mFps(fps), mModeOrder(order)
45     { }
46 };
47 
48 class HDMIDisplay
49 {
50 public:
51     HDMIDisplay();
52     ~HDMIDisplay();
53     void setHPD(uint32_t startEnd);
54     void setActionSafeDimension(int w, int h);
isCEUnderscanSupported()55     bool isCEUnderscanSupported() { return mUnderscanSupported; }
56     int configure();
57     void getAttributes(uint32_t& width, uint32_t& height);
58     int teardown();
getWidth()59     uint32_t getWidth() const { return mXres; };
getHeight()60     uint32_t getHeight() const { return mYres; };
getVsyncPeriod()61     uint32_t getVsyncPeriod() const { return mVsyncPeriod; };
getFd()62     int getFd() const { return mFd; };
getMDPScalingMode()63     bool getMDPScalingMode() const { return mMDPScalingMode; }
64     void activateDisplay();
65     /* Returns true if HDMI is the PRIMARY display device*/
66     bool isHDMIPrimaryDisplay();
67     int getConnectedState();
68     /* when HDMI is an EXTERNAL display, PRIMARY display attributes are needed
69        for scaling mode */
70     void setPrimaryAttributes(uint32_t primaryWidth, uint32_t primaryHeight);
71 
72 private:
73     int getModeCount() const;
74     void setSPDInfo(const char* node, const char* property);
75     void readCEUnderscanInfo();
76     bool readResolution();
77     int  parseResolution(char* edidMode);
78     bool openFrameBuffer();
79     bool closeFrameBuffer();
80     bool writeHPDOption(int userOption) const;
81     bool isValidMode(int mode);
82     int  getModeOrder(int mode);
83     int  getUserMode();
84     int  getBestMode();
85     bool isInterlacedMode(int mode);
86     void resetInfo();
87     void setAttributes();
88     void getAttrForMode(uint32_t& width, uint32_t& height, uint32_t& fps);
89     int openDeviceNode(const char* node, int fileMode) const;
90 
91     int mFd;
92     int mFbNum;
93     int mCurrentMode;
94     int mEDIDModes[64];
95     int mModeCount;
96     fb_var_screeninfo mVInfo;
97     // Holds all the HDMI modes and timing info supported by driver
98     msm_hdmi_mode_timing_info* supported_video_mode_lut;
99     uint32_t mXres, mYres, mVsyncPeriod, mPrimaryWidth, mPrimaryHeight;
100     bool mMDPScalingMode;
101     bool mUnderscanSupported;
102     // Downscale feature switch, set via system property
103     // sys.hwc.mdp_downscale_enabled
104     bool mMDPDownscaleEnabled;
105     int mDisplayId;
106 };
107 
108 }; //qhwc
109 // ---------------------------------------------------------------------------
110 #endif //HWC_HDMI_DISPLAY_H
111