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