1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2010 The Android Open Source Project
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Not a Contribution, Apache license notifications and license are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * retained for attribution purposes only.
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License.
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License.
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef HWC_HDMI_DISPLAY_H
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HWC_HDMI_DISPLAY_H
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <linux/fb.h>
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct msm_hdmi_mode_timing_info;
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qhwc {
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Type of scanning of EDID(Video Capability Data Block)
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinenum hdmi_scansupport_type {
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    HDMI_SCAN_NOT_SUPPORTED      = 0,
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    HDMI_SCAN_ALWAYS_OVERSCANED  = 1,
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    HDMI_SCAN_ALWAYS_UNDERSCANED = 2,
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    HDMI_SCAN_BOTH_SUPPORTED     = 3
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Structure to store EDID related data
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct EDIDData {
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mMode, mWidth, mHeight, mFps;
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Predetermined ordering for each mode
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mModeOrder;
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    EDIDData(int mode, int width, int height, int fps, int order)
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    : mMode(mode), mWidth(width), mHeight(height), mFps(fps), mModeOrder(order)
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    { }
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass HDMIDisplay
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    HDMIDisplay();
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ~HDMIDisplay();
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setHPD(uint32_t startEnd);
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setActionSafeDimension(int w, int h);
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool isCEUnderscanSupported() { return mUnderscanSupported; }
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int configure();
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void getAttributes(uint32_t& width, uint32_t& height);
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int teardown();
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t getWidth() const { return mXres; };
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t getHeight() const { return mYres; };
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t getVsyncPeriod() const { return mVsyncPeriod; };
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getFd() const { return mFd; };
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool getMDPScalingMode() const { return mMDPScalingMode; }
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void activateDisplay();
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* Returns true if HDMI is the PRIMARY display device*/
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool isHDMIPrimaryDisplay();
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getConnectedState();
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* when HDMI is an EXTERNAL display, PRIMARY display attributes are needed
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin       for scaling mode */
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setPrimaryAttributes(uint32_t primaryWidth, uint32_t primaryHeight);
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getActiveConfig() const { return mActiveConfig; };
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int setActiveConfig(int newConfig);
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getAttrForConfig(int config, uint32_t& xres,
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            uint32_t& yres, uint32_t& refresh) const;
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getDisplayConfigs(uint32_t* configs, size_t* numConfigs) const;
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getModeCount() const;
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setSPDInfo(const char* node, const char* property);
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void readCEUnderscanInfo();
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool readResolution();
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int  parseResolution(char* edidMode);
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool openFrameBuffer();
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool closeFrameBuffer();
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool writeHPDOption(int userOption) const;
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool isValidMode(int mode);
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int  getModeOrder(int mode);
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int  getUserConfig();
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int  getBestConfig();
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool isInterlacedMode(int mode);
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void resetInfo();
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void setAttributes();
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void getAttrForMode(uint32_t& width, uint32_t& height, uint32_t& fps);
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int openDeviceNode(const char* node, int fileMode) const;
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int getModeIndex(int mode);
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool isValidConfigChange(int newConfig);
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mFd;
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mFbNum;
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // mCurrentMode is the HDMI video format that corresponds to the mEDIDMode
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // entry referenced by mActiveConfig
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mCurrentMode;
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // mActiveConfig is the index correponding to the currently active mode for
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // the HDMI display. It basically indexes the mEDIDMode array
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mActiveConfig;
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // mEDIDModes contains a list of HDMI video formats (modes) supported by the
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // HDMI display
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mEDIDModes[64];
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mModeCount;
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    fb_var_screeninfo mVInfo;
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Holds all the HDMI modes and timing info supported by driver
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    msm_hdmi_mode_timing_info* supported_video_mode_lut;
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t mXres, mYres, mVsyncPeriod, mPrimaryWidth, mPrimaryHeight;
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mMDPScalingMode;
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mUnderscanSupported;
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Downscale feature switch, set via system property
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // sys.hwc.mdp_downscale_enabled
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mMDPDownscaleEnabled;
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mEnableResolutionChange;
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mDisplayId;
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; //qhwc
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ---------------------------------------------------------------------------
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif //HWC_HDMI_DISPLAY_H
126