1ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed/* 2ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project 356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 4ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 5ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Not a Contribution, Apache license notifications and license are 6ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * retained for attribution purposes only. 7ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 8ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * you may not use this file except in compliance with the License. 10ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * You may obtain a copy of the License at 11ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 12ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 14ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 15ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * See the License for the specific language governing permissions and 18ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * limitations under the License. 19ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed */ 20ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#define DEBUG 0 22ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <ctype.h> 231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <fcntl.h> 24ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/threads.h> 25ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Errors.h> 26ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Log.h> 27ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 28ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/msm_mdp.h> 2956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R#include <video/msm_hdmi_modes.h> 30ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/fb.h> 31ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <sys/ioctl.h> 32ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <cutils/properties.h> 33ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include "hwc_utils.h" 34bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 35bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "overlayUtils.h" 36620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#include "overlay.h" 37fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar#include "mdp_version.h" 38bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 39bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahusing namespace android; 40ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 41ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmednamespace qhwc { 429d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define MAX_SYSFS_FILE_PATH 255 439d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define UNKNOWN_STRING "unknown" 449d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define SPD_NAME_LENGTH 16 452040a273da33b131c49242c61967bf19a57bc378Arun Kumar K.R/* Max. resolution assignable to when downscale */ 462040a273da33b131c49242c61967bf19a57bc378Arun Kumar K.R#define SUPPORTED_DOWNSCALE_EXT_AREA (1920*1080) 472040a273da33b131c49242c61967bf19a57bc378Arun Kumar K.R 48620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 49361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranint ExternalDisplay::configure() { 50361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!openFrameBuffer()) { 51361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to open FB: %d", __FUNCTION__, mFbNum); 52620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 53361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 540ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R readCEUnderscanInfo(); 55620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar readResolution(); 56620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // TODO: Move this to activate 57c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Used for changing the resolution 58c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * getUserMode will get the preferred 59c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * mode set thru adb shell */ 60c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = getUserMode(); 61c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if (mode == -1) { 62c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //Get the best mode and set 63c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R mode = getBestMode(); 64c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 65c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R setResolution(mode); 66361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran setAttributes(); 67aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar // set system property 68aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar property_set("hw.hdmiON", "1"); 69620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 70620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 71620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 72fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttributes(int& width, int& height) { 73fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int fps = 0; 74fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar getAttrForMode(width, height, fps); 75fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar} 76fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar 77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranint ExternalDisplay::teardown() { 78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran closeFrameBuffer(); 79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran resetInfo(); 80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // unset system property 81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran property_set("hw.hdmiON", "0"); 82620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 83620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 84ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 85080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 86361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mCurrentMode(-1), mModeCount(0), 87361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mUnderscanSupported(false), mHwcContext(ctx) 88ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 89080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 90361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mFbNum = overlay::Overlay::getInstance()->getFbForDpy(HWC_DISPLAY_EXTERNAL); 91a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // disable HPD at start, it will be enabled later 92a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // when the display powers on 93a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // This helps for framework reboot or adb shell stop/start 94a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R writeHPDOption(0); 9590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar 9656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // for HDMI - retreive all the modes supported by the driver 97361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(mFbNum != -1) { 9856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R supported_video_mode_lut = 9956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R new msm_hdmi_mode_timing_info[HDMI_VFRMT_MAX]; 10056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // Populate the mode table for supported modes 10156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_INIT_TIMINGS(supported_video_mode_lut); 10256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_SET_SUPP_TIMINGS(supported_video_mode_lut, 10356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_ALL); 1049d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Update the Source Product Information 1059d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Vendor Name 1069d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R setSPDInfo("vendor_name", "ro.product.manufacturer"); 1079d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Product Description 1089d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R setSPDInfo("product_description", "ro.product.name"); 1099d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 1109d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R} 1119d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R/* gets the product manufacturer and product name and writes it 1129d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * to the sysfs node, so that the driver can get that information 1139d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * Used to show QCOM 8974 instead of Input 1 for example 1149d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R */ 1159d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.Rvoid ExternalDisplay::setSPDInfo(const char* node, const char* property) { 116cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ssize_t err = -1; 1179d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char info[PROPERTY_VALUE_MAX]; 1189d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsSPDFilePath[MAX_SYSFS_FILE_PATH]; 1199d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R memset(sysFsSPDFilePath, 0, sizeof(sysFsSPDFilePath)); 1209d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsSPDFilePath , sizeof(sysFsSPDFilePath), 1219d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/%s", 122361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mFbNum, node); 1239d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R int spdFile = open(sysFsSPDFilePath, O_RDWR, 0); 1249d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (spdFile < 0) { 1259d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGE("%s: file '%s' not found : ret = %d" 1269d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "err str: %s", __FUNCTION__, sysFsSPDFilePath, 1279d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R spdFile, strerror(errno)); 1289d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } else { 1299d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R memset(info, 0, sizeof(info)); 1309d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R property_get(property, info, UNKNOWN_STRING); 1319d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGD_IF(DEBUG, "In %s: %s = %s", __FUNCTION__, property, info); 1329d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (strncmp(info, UNKNOWN_STRING, SPD_NAME_LENGTH)) { 1339d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R err = write(spdFile, info, strlen(info)); 1349d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (err <= 0) { 1359d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGE("%s: file write failed for '%s'" 1369d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "err no = %d", __FUNCTION__, sysFsSPDFilePath, errno); 1379d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 1389d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } else { 1399d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGD_IF(DEBUG, "%s: property_get failed for SPD %s", 1409d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R __FUNCTION__, node); 1419d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 1429d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R close(spdFile); 14356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 144ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 145ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 146bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 147bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 148bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah writeHPDOption(startEnd); 149bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 150bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 151bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 152bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 1530ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeWidth[PROPERTY_VALUE_MAX]; 1540ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeHeight[PROPERTY_VALUE_MAX]; 1559d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(actionsafeWidth, sizeof(actionsafeWidth), "%d", w); 1561afa12c45ee08b13e96c681f3b21412b68a9b2b4Arun Kumar K.R property_set("persist.sys.actionsafe.width", actionsafeWidth); 1579d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(actionsafeHeight, sizeof(actionsafeHeight), "%d", h); 1581afa12c45ee08b13e96c681f3b21412b68a9b2b4Arun Kumar K.R property_set("persist.sys.actionsafe.height", actionsafeHeight); 159bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 160bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 161bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahint ExternalDisplay::getModeCount() const { 162bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 163bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah return mModeCount; 164bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 165bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 166bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 167bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah for(int i = 0;i < mModeCount;i++) { 168bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah out[i] = mEDIDModes[i]; 169bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah } 170bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 171bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 1720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.Rvoid ExternalDisplay::readCEUnderscanInfo() 1730ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R{ 1740ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int hdmiScanInfoFile = -1; 175cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ssize_t len = -1; 1760ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char scanInfo[17]; 1770ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char *ce_info_str = NULL; 178c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan char *save_ptr; 1790ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char token[] = ", \n"; 1800ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int ce_info = -1; 1819d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsScanInfoFilePath[MAX_SYSFS_FILE_PATH]; 1829d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsScanInfoFilePath, sizeof(sysFsScanInfoFilePath), 1839d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/" 184361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran "scan_info", mFbNum); 1850ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 1860ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R memset(scanInfo, 0, sizeof(scanInfo)); 1870ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R hdmiScanInfoFile = open(sysFsScanInfoFilePath, O_RDONLY, 0); 1880ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (hdmiScanInfoFile < 0) { 1890ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGD_IF(DEBUG, "%s: scan_info file '%s' not found", 1900ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 1910ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 1920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 1930ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R len = read(hdmiScanInfoFile, scanInfo, sizeof(scanInfo)-1); 194cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ALOGD("%s: Scan Info string: %s length = %zu", 1950ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, scanInfo, len); 1960ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (len <= 0) { 1970ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R close(hdmiScanInfoFile); 1980ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: Scan Info file empty '%s'", 1990ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 2000ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2010ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2020ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R scanInfo[len] = '\0'; /* null terminate the string */ 203cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi close(hdmiScanInfoFile); 2040ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2050ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2060ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* 2070ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * The scan_info contains the three fields 2080ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * PT - preferred video format 2090ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * IT - video format 2100ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * CE video format - containing the underscan support information 2110ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R */ 2120ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2130ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* PT */ 214c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan ce_info_str = strtok_r(scanInfo, token, &save_ptr); 2150ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2160ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* IT */ 217c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan ce_info_str = strtok_r(NULL, token, &save_ptr); 2180ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2190ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* CE */ 220c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan ce_info_str = strtok_r(NULL, token, &save_ptr); 2210ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) 2220ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info = atoi(ce_info_str); 2230ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2240ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2250ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2260ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2270ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // ce_info contains the underscan information 2280ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info == EXT_SCAN_ALWAYS_UNDERSCANED || 2290ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info == EXT_SCAN_BOTH_SUPPORTED) 2300ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // if TV supported underscan, then driver will always underscan 2310ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // hence no need to apply action safe rectangle 2320ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = true; 2330ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 2340ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: scan_info string error", __FUNCTION__); 2350ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2360ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2370ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Store underscan support info in a system property 2380ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = (mUnderscanSupported) ? "1" : "0"; 2390ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 2400ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2410ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R} 2420ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2431589dee5c27293d278d3e549af8a4bda27e080f8Naseer AhmedExternalDisplay::~ExternalDisplay() 2441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 24556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R delete [] supported_video_mode_lut; 246080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed closeFrameBuffer(); 247ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 248ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 24956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R/* 25056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * sets the fb_var_screeninfo from the hdmi_mode_timing_info 25156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R */ 25256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.Rvoid setDisplayTiming(struct fb_var_screeninfo &info, 25356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const msm_hdmi_mode_timing_info* mode) 254ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 255ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[0] = 0; 256ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[1] = 0; 257ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[2] = 0; 258e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifndef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 25956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.reserved[3] = (info.reserved[3] & 0xFFFF) | 26056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R (mode->video_format << 16); 261e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 262ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.xoffset = 0; 263ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.yoffset = 0; 26456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.xres = mode->active_h; 26556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.yres = mode->active_v; 26656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 26756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.pixclock = (mode->pixel_freq)*1000; 26856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vmode = mode->interlaced ? 26956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 27056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 27156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.right_margin = mode->front_porch_h; 27256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.hsync_len = mode->pulse_width_h; 27356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.left_margin = mode->back_porch_h; 27456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.lower_margin = mode->front_porch_v; 27556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vsync_len = mode->pulse_width_v; 27656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.upper_margin = mode->back_porch_v; 27756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R} 2781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 279080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 280ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 281ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char delim = ','; 282ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int count = 0; 283ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char *start, *end; 284ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // EDIDs are string delimited by ',' 285ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Ex: 16,4,5,3,32,34,1 286ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Parse this string to get mode(int) 287ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = (char*) edidStr; 288080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed end = &delim; 289080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed while(*end == delim) { 290080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 291ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = end+1; 292ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed count++; 293ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 294080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 295080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed for (int i = 0; i < count; i++) 296080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 297ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return count; 298ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 299080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 3001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::readResolution() 301ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 3029d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsEDIDFilePath[MAX_SYSFS_FILE_PATH]; 3039d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsEDIDFilePath , sizeof(sysFsEDIDFilePath), 304361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran "/sys/devices/virtual/graphics/fb%d/edid_modes", mFbNum); 305620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 306620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 307cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ssize_t len = -1; 308a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R char edidStr[128] = {'\0'}; 309ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 310ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (hdmiEDIDFile < 0) { 311080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 312620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 313ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return false; 314ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } else { 315a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R len = read(hdmiEDIDFile, edidStr, sizeof(edidStr)-1); 316cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ALOGD_IF(DEBUG, "%s: EDID string: %s length = %zu", 317a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R __FUNCTION__, edidStr, len); 318ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if ( len <= 0) { 319080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 320620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 321a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R edidStr[0] = '\0'; 322ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 323ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed else { 324a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R while (len > 1 && isspace(edidStr[len-1])) { 325ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed --len; 326a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R } 327a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R edidStr[len] = '\0'; 328ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 329cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi close(hdmiEDIDFile); 330ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 331ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(len > 0) { 332620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 333a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R mModeCount = parseResolution(edidStr, mEDIDModes); 3341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 3351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed mModeCount); 336ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 337ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 338a2aa8d73e3e67473a0383aed024a61e4aa9aa003Arun Kumar K.R return (len > 0); 339ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 340ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 341361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranbool ExternalDisplay::openFrameBuffer() 342ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 343080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd == -1) { 344361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran char strDevPath[MAX_SYSFS_FILE_PATH]; 345361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran snprintf(strDevPath, MAX_SYSFS_FILE_PATH, "/dev/graphics/fb%d", mFbNum); 346361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mFd = open(strDevPath, O_RDWR); 347080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd < 0) 348361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: %s is not available", __FUNCTION__, strDevPath); 349361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 3502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 351080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (mFd > 0); 352080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 353080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 354080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedbool ExternalDisplay::closeFrameBuffer() 355080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 356080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 35750e19d2c536783fad3c29f8ffced6ba5915e7f06Naseer Ahmed if(mFd >= 0) { 358080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = close(mFd); 359080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mFd = -1; 360ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 362080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (ret == 0); 363ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 364ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 365080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed// clears the vinfo, edid, best modes 366080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedvoid ExternalDisplay::resetInfo() 367080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 368080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 369080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 370080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mModeCount = 0; 371080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = -1; 3720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = false; 3730ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Reset the underscan supported system property 3740ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = "0"; 3750ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 376080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 377ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 3781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 379ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 380c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // XXX: We dont support interlaced modes but having 38156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // it here for future 382ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed switch (mode) { 383ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed default: 38456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 385ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 1; // 480i 4:3 38656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 387ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 2; // 480i 16:9 38856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 389ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 3; // i576i 4:3 39056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 391ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 4; // 576i 16:9 392ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 393ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 5; // 1080i 16:9 39456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 395ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 6; // 640x480 4:3 39656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 397ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 7; // 480p 4:3 39856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 399ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 8; // 480p 16:9 40056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 401ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 9; // 576p 4:3 40256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 403ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 10; // 576p 16:9 404d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R case HDMI_VFRMT_1024x768p60_4_3: 405d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 11; // 768p 4:3 Vesa format 406ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 407d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 12; // 1024p Vesa format 40856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 409d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 13; // 720p@50Hz 41056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 411d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 14; // 720p@60Hz 41256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 413d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 15; //1080p@24Hz 41456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 415d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 16; //108-p@25Hz 41656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 417d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 17; //1080p@30Hz 41856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 419d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 18; //1080p@50Hz 42056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 421d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 19; //1080p@60Hz 42293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_2560x1600p60_16_9: 423d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 20; //WQXGA@60Hz541 42493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p24_16_9: 425d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 21;//2160@24Hz 42693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p25_16_9: 427d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 22;//2160@25Hz 42893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p30_16_9: 429d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 23; //2160@30Hz 43093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_4096x2160p24_16_9: 431d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R return 24; //4kx2k@24Hz 4321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 433ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 434ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 435c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R/// Returns the user mode set(if any) using adb shell 436c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rint ExternalDisplay::getUserMode() { 437c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Based on the property set the resolution */ 438c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R char property_value[PROPERTY_VALUE_MAX]; 43996b413618bcdd213927494ca85f022bc78bbc60fArun Kumar K.R property_get("hw.hdmi.resolution", property_value, "-1"); 440c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = atoi(property_value); 441c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // We dont support interlaced modes 442c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(isValidMode(mode) && !isInterlacedMode(mode)) { 44359644b2127280052ca410cb053f0a41c3181a97aNaseer Ahmed ALOGD_IF(DEBUG, "%s: setting the HDMI mode = %d", __FUNCTION__, mode); 444c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return mode; 445c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 446c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return -1; 447c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 448c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 449ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Get the best mode for the current HD TV 4501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getBestMode() { 451ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int bestOrder = 0; 45256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R int bestMode = HDMI_VFRMT_640x480p60_4_3; 453ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // for all the edid read, get the best mode 454ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed for(int i = 0; i < mModeCount; i++) { 455ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int mode = mEDIDModes[i]; 456ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int order = getModeOrder(mode); 457ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (order > bestOrder) { 458ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestOrder = order; 459ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestMode = mode; 460ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 461ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 462ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return bestMode; 4631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 464ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 4651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 466ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 467c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool valid = false; 468c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R for (int i = 0; i < mModeCount; i++) { 469c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(ID == mEDIDModes[i]) { 470c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R valid = true; 471c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R break; 472c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 473c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 474c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return valid; 475c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 476c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 477c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format 478c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) { 479c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool interlaced = false; 480c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R switch(ID) { 48156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 48256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 48356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 48456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 48556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 486c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = true; 487d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R break; 488c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R default: 489c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = false; 490d53530e64a89c7e50d2357c671fc28cf34b30208Arun Kumar K.R break; 491c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 492c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return interlaced; 493ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 494ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 4951589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 496ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 497080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 498080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 499080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if(ret < 0) { 500080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 501080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed strerror(errno)); 502080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 503080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 504080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 505080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 506080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 507080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 508080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 509c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //If its a new ID - update var_screeninfo 510080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 51156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *mode = 5121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed &supported_video_mode_lut[0]; 51356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R for (unsigned int i = 0; i < HDMI_VFRMT_MAX; ++i) { 51456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *cur = 51556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R &supported_video_mode_lut[i]; 51656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R if (cur->video_format == (uint32_t)ID) { 517ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mode = cur; 51856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R break; 51956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 520ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 52156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R setDisplayTiming(mVInfo, mode); 522080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 5231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 52497133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mode->video_format, mVInfo.xres, mVInfo.yres, 525080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 526080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 527080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 528e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifdef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 529e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang struct msmfb_metadata metadata; 530e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang memset(&metadata, 0 , sizeof(metadata)); 531e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.op = metadata_op_vic; 532e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.data.video_info_code = mode->video_format; 533e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang if (ioctl(mFd, MSMFB_METADATA_SET, &metadata) == -1) { 534e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang ALOGD("In %s: MSMFB_METADATA_SET failed Err Str = %s", 535e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang __FUNCTION__, strerror(errno)); 536e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang } 537e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 53897133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 53997133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 54097133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R if(ret < 0) { 54197133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 54297133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R __FUNCTION__, strerror(errno)); 54397133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R } 544080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = ID; 545ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 546ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 547ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 549ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 550ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bool ret = true; 551361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(mFbNum != -1) { 552c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R char sysFsHPDFilePath[MAX_SYSFS_FILE_PATH]; 553c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R snprintf(sysFsHPDFilePath ,sizeof(sysFsHPDFilePath), 554361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran "/sys/devices/virtual/graphics/fb%d/hpd", mFbNum); 555c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 556c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R if (hdmiHPDFile < 0) { 557361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: state file '%s' not found : ret%d err str: %s", 558361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 559ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 560c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R } else { 561cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi ssize_t err = -1; 562c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 563c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R if(userOption) 564c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R err = write(hdmiHPDFile, "1", 2); 565c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R else 566c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R err = write(hdmiHPDFile, "0" , 2); 567c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R if (err <= 0) { 568361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: file write failed '%s'", __FUNCTION__, 569361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran sysFsHPDFilePath); 570c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R ret = false; 571c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R } 572c34e3ff840266288c03bfcf6734a25cb80b22373Arun Kumar K.R close(hdmiHPDFile); 573ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 574ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 575ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return ret; 576ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 577080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 578fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar 579361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranvoid ExternalDisplay::setAttributes() { 5802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int width = 0, height = 0, fps = 0; 5812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah getAttrForMode(width, height, fps); 582361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 583fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 584fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // Always set dpyAttr res to mVInfo res 585fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 586fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 587fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].mDownScaleMode = false; 588bad2217825fe0a98d9c4a987a139f4d7a0e05a2fTatenda Chipeperekwa if(!qdutils::MDPVersion::getInstance().is8x26() 589bad2217825fe0a98d9c4a987a139f4d7a0e05a2fTatenda Chipeperekwa && mHwcContext->mMDPDownscaleEnabled) { 590fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int priW = mHwcContext->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 591fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int priH = mHwcContext->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 592fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // if primary resolution is more than the hdmi resolution 593fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // configure dpy attr to primary resolution and set 594fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // downscale mode 5957394a4b56677e6f750b699c16111daa08429c209Manoj Kumar AVM // Restrict this upto 1080p resolution max 5967394a4b56677e6f750b699c16111daa08429c209Manoj Kumar AVM if(((priW * priH) > (width * height)) && 5972040a273da33b131c49242c61967bf19a57bc378Arun Kumar K.R ((priW * priH) <= SUPPORTED_DOWNSCALE_EXT_AREA)) { 598fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = priW; 599fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = priH; 600fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // HDMI is always in landscape, so always assign the higher 601fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // dimension to hdmi's xres 602fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar if(priH > priW) { 603fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = priH; 604fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = priW; 605fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar } 606fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // Set External Display MDP Downscale mode indicator 607fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].mDownScaleMode =true; 608fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar } 609fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar } 610fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 611cf40ec929a1ddf18023dad9647e7be08638b659dDileep Kumar Reddi (int) 1000000000l / fps; 612fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar } 6132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 615620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 6162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (mCurrentMode) { 61756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 6182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 640; 6192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 6202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 62256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 62356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 6242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 6252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 6262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 62856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 62956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 6302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 6312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 576; 6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 63456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 6362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 63956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 6412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 6422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 644ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 645ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R width = 1280; 646ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R height = 1024; 647ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R fps = 60; 648ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R break; 649d22dec70121283832cf0cf3305c838a1e529768fManoj Rao case HDMI_VFRMT_1024x768p60_4_3: 650d22dec70121283832cf0cf3305c838a1e529768fManoj Rao width = 1024; 651d22dec70121283832cf0cf3305c838a1e529768fManoj Rao height = 768; 652d22dec70121283832cf0cf3305c838a1e529768fManoj Rao fps = 60; 653d22dec70121283832cf0cf3305c838a1e529768fManoj Rao break; 65456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 6552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 24; 6582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 65956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 6602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 25; 6632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 66456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 6652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 30; 6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 66956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 6702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 67456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 67993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_2560x1600p60_16_9: 68093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 2560; 68193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 1600; 68293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 60; 68393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 68493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p24_16_9: 68593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 3840; 68693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 68793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 24; 68893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 689d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R case HDMI_VFRMT_3840x2160p25_16_9: 690d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R width = 3840; 691d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R height = 2160; 692d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R fps = 25; 693d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R break; 69493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p30_16_9: 69593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 3840; 69693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 69793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 30; 69893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 69993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_4096x2160p24_16_9: 70093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 4096; 70193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 70293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 24; 70393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 70493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel 705080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 706080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 707080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 708ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; 709