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