external.cpp revision d0d432cf032707cbdea7635619ad5622bfc1b371
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 <media/IAudioPolicyService.h>
25ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <media/AudioSystem.h>
26ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/threads.h>
27ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Errors.h>
28ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Log.h>
29ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
30ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/msm_mdp.h>
3156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R#include <video/msm_hdmi_modes.h>
32ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/fb.h>
33ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <sys/ioctl.h>
34ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <sys/poll.h>
351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <sys/resource.h>
36ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <cutils/properties.h>
37ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include "hwc_utils.h"
38bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
39bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "overlayUtils.h"
40620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#include "overlay.h"
41bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
42bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahusing namespace android;
43ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
44ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmednamespace qhwc {
45ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
46620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#define MAX_FRAME_BUFFER_NAME_SIZE      (80)
47620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#define MAX_DISPLAY_DEVICES             (3)
489d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define MAX_SYSFS_FILE_PATH             255
499d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define UNKNOWN_STRING                  "unknown"
509d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define SPD_NAME_LENGTH                 16
51620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
52620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarconst char* msmFbDevicePath[] = {  "/dev/graphics/fb1",
53620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                                   "/dev/graphics/fb2"};
54620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
55620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar/*
56620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * Updates extDeviceFbIndex Array with the correct frame buffer indices
57620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * of avaiable external devices
58620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar *
59620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar */
60620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::updateExtDispDevFbIndex()
61620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar{
62620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    FILE *displayDeviceFP = NULL;
63620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    char fbType[MAX_FRAME_BUFFER_NAME_SIZE];
64620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE];
65620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
66620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    for(int j = 1; j < MAX_DISPLAY_DEVICES; j++) {
679d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        snprintf (msmFbTypePath, sizeof(msmFbTypePath),
689d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                  "/sys/class/graphics/fb%d/msm_fb_type", j);
69620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        displayDeviceFP = fopen(msmFbTypePath, "r");
70620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        if(displayDeviceFP){
71620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE,
72620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                    displayDeviceFP);
73620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0){
74620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                ALOGD_IF(DEBUG,"hdmi framebuffer index is %d",j);
75620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                mHdmiFbNum = j;
76620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            } else if(strncmp(fbType, "writeback panel",
77620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                                    strlen("writeback panel")) == 0){
78620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                ALOGD_IF(DEBUG,"wfd framebuffer index is %d",j);
79620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                mWfdFbNum = j;
80620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            }
81620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            fclose(displayDeviceFP);
82620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        }
83620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
84620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    ALOGD_IF(DEBUG,"%s: mHdmiFbNum: %d mWfdFbNum: %d ",__FUNCTION__,
85620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                                                       mHdmiFbNum, mWfdFbNum);
86620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
87620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
88620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureHDMIDisplay() {
89620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    openFrameBuffer(mHdmiFbNum);
90620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mFd == -1)
91620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        return -1;
920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    readCEUnderscanInfo();
93620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    readResolution();
94620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    // TODO: Move this to activate
95c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    /* Used for changing the resolution
96c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R     * getUserMode will get the preferred
97c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R     * mode set thru adb shell */
98c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    int mode = getUserMode();
99c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    if (mode == -1) {
100c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        //Get the best mode and set
101c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        mode = getBestMode();
102c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    }
103c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    setResolution(mode);
104620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setDpyHdmiAttr();
105620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setExternalDisplay(true, mHdmiFbNum);
106aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    // set system property
107aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    property_set("hw.hdmiON", "1");
108620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    return 0;
109620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
110620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
111620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureWFDDisplay() {
112620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    int ret = 0;
113620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mConnectedFbNum == mHdmiFbNum) {
114620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGE("%s: Cannot process WFD connection while HDMI is active",
115620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                     __FUNCTION__);
116620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        return -1;
117620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
118620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    openFrameBuffer(mWfdFbNum);
119620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mFd == -1)
120620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        return -1;
121620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo);
122620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(ret < 0) {
123620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__,
124620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                strerror(errno));
125620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
126620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setDpyWfdAttr();
127620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setExternalDisplay(true, mWfdFbNum);
128620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    return 0;
129620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
130620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
131620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownHDMIDisplay() {
132620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mConnectedFbNum == mHdmiFbNum) {
133620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        // hdmi offline event..!
134620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        closeFrameBuffer();
135620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        resetInfo();
136620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        setExternalDisplay(false);
137aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        // unset system property
138aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        property_set("hw.hdmiON", "0");
139620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
140620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    return 0;
141620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
142ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
143620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownWFDDisplay() {
144620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mConnectedFbNum == mWfdFbNum) {
145620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        // wfd offline event..!
146620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        closeFrameBuffer();
147620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        memset(&mVInfo, 0, sizeof(mVInfo));
148620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        setExternalDisplay(false);
149620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
150620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    return 0;
151620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
152ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
153aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumarint ExternalDisplay::ignoreRequest(const char *str) {
154620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    const char *s1 = str + strlen("change@/devices/virtual/switch/");
155aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    if(!strncmp(s1,"wfd",strlen(s1))) {
156aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        if(mConnectedFbNum == mHdmiFbNum) {
157aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar            ALOGE("Ignore wfd event when HDMI is active");
158aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar            return true;
159aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        }
160620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
161aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    return false;
162620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
163ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
164ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
165080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1),
166620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0),
16790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    mUnderscanSupported(false), mHwcContext(ctx), mHdmiFbNum(-1),
16890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar    mWfdFbNum(-1), mExtDpyNum(HWC_DISPLAY_EXTERNAL)
169ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
170080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    memset(&mVInfo, 0, sizeof(mVInfo));
171620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    //Determine the fb index for external display devices.
172620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    updateExtDispDevFbIndex();
173a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R    // disable HPD at start, it will be enabled later
174a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R    // when the display powers on
175a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R    // This helps for framework reboot or adb shell stop/start
176a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R    writeHPDOption(0);
17790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar
17856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    // for HDMI - retreive all the modes supported by the driver
17956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    if(mHdmiFbNum != -1) {
18056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        supported_video_mode_lut =
18156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                        new msm_hdmi_mode_timing_info[HDMI_VFRMT_MAX];
18256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        // Populate the mode table for supported modes
18356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        MSM_HDMI_MODES_INIT_TIMINGS(supported_video_mode_lut);
18456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        MSM_HDMI_MODES_SET_SUPP_TIMINGS(supported_video_mode_lut,
18556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                                        MSM_HDMI_MODES_ALL);
1869d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        // Update the Source Product Information
1879d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        // Vendor Name
1889d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        setSPDInfo("vendor_name", "ro.product.manufacturer");
1899d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        // Product Description
1909d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        setSPDInfo("product_description", "ro.product.name");
1919d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    }
1929d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R}
1939d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R/* gets the product manufacturer and product name and writes it
1949d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * to the sysfs node, so that the driver can get that information
1959d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * Used to show QCOM 8974 instead of Input 1 for example
1969d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R */
1979d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.Rvoid ExternalDisplay::setSPDInfo(const char* node, const char* property) {
1989d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    int err = -1;
1999d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    char info[PROPERTY_VALUE_MAX];
2009d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    char sysFsSPDFilePath[MAX_SYSFS_FILE_PATH];
2019d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    memset(sysFsSPDFilePath, 0, sizeof(sysFsSPDFilePath));
2029d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(sysFsSPDFilePath , sizeof(sysFsSPDFilePath),
2039d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                 "/sys/devices/virtual/graphics/fb%d/%s",
2049d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                 mHdmiFbNum, node);
2059d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    int spdFile = open(sysFsSPDFilePath, O_RDWR, 0);
2069d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    if (spdFile < 0) {
2079d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        ALOGE("%s: file '%s' not found : ret = %d"
2089d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R              "err str: %s",  __FUNCTION__, sysFsSPDFilePath,
2099d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R              spdFile, strerror(errno));
2109d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    } else {
2119d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        memset(info, 0, sizeof(info));
2129d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        property_get(property, info, UNKNOWN_STRING);
2139d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        ALOGD_IF(DEBUG, "In %s: %s = %s", __FUNCTION__, property, info);
2149d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        if (strncmp(info, UNKNOWN_STRING, SPD_NAME_LENGTH)) {
2159d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            err = write(spdFile, info, strlen(info));
2169d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            if (err <= 0) {
2179d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                ALOGE("%s: file write failed for '%s'"
2189d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                      "err no = %d", __FUNCTION__, sysFsSPDFilePath, errno);
2199d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            }
2209d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        } else {
2219d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            ALOGD_IF(DEBUG, "%s: property_get failed for SPD %s",
2229d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R                         __FUNCTION__, node);
2239d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        }
2249d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R        close(spdFile);
22556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    }
226ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
227ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
228bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) {
229bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(DEBUG,"resMode=%d ", resMode);
230bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    {
231bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        Mutex::Autolock lock(mExtDispLock);
232620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        setExternalDisplay(false);
233620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        openFrameBuffer(mHdmiFbNum);
234bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        setResolution(resMode);
235bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    }
236620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setExternalDisplay(true, mHdmiFbNum);
237bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
238bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
239bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) {
240bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd);
241bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    writeHPDOption(startEnd);
242bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
243bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
244bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) {
245bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h);
246bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    Mutex::Autolock lock(mExtDispLock);
2470ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    char actionsafeWidth[PROPERTY_VALUE_MAX];
2480ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    char actionsafeHeight[PROPERTY_VALUE_MAX];
2499d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(actionsafeWidth, sizeof(actionsafeWidth), "%d", w);
2500ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    property_set("hw.actionsafe.width", actionsafeWidth);
2519d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(actionsafeHeight, sizeof(actionsafeHeight), "%d", h);
2520ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    property_set("hw.actionsafe.height", actionsafeHeight);
253620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    setExternalDisplay(true, mHdmiFbNum);
254bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
255bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
256bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahint ExternalDisplay::getModeCount() const {
257bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount);
258bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    Mutex::Autolock lock(mExtDispLock);
259bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    return mModeCount;
260bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
261bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
262bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const {
263bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    Mutex::Autolock lock(mExtDispLock);
264bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    for(int i = 0;i < mModeCount;i++) {
265bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        out[i] = mEDIDModes[i];
266bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    }
267bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
268bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
2690ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.Rvoid ExternalDisplay::readCEUnderscanInfo()
2700ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R{
2710ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    int hdmiScanInfoFile = -1;
2720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    int len = -1;
2730ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    char scanInfo[17];
2740ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    char *ce_info_str = NULL;
2750ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    const char token[] = ", \n";
2760ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    int ce_info = -1;
2779d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    char sysFsScanInfoFilePath[MAX_SYSFS_FILE_PATH];
2789d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(sysFsScanInfoFilePath, sizeof(sysFsScanInfoFilePath),
2799d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            "/sys/devices/virtual/graphics/fb%d/"
2800ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R                                   "scan_info", mHdmiFbNum);
2810ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
2820ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    memset(scanInfo, 0, sizeof(scanInfo));
2830ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    hdmiScanInfoFile = open(sysFsScanInfoFilePath, O_RDONLY, 0);
2840ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    if (hdmiScanInfoFile < 0) {
2850ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        ALOGD_IF(DEBUG, "%s: scan_info file '%s' not found",
2860ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R                                __FUNCTION__, sysFsScanInfoFilePath);
2870ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        return;
2880ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    } else {
2890ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        len = read(hdmiScanInfoFile, scanInfo, sizeof(scanInfo)-1);
2900ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        ALOGD("%s: Scan Info string: %s length = %d",
2910ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R                 __FUNCTION__, scanInfo, len);
2920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        if (len <= 0) {
2930ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            close(hdmiScanInfoFile);
2940ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            ALOGE("%s: Scan Info file empty '%s'",
2950ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R                                __FUNCTION__, sysFsScanInfoFilePath);
2960ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            return;
2970ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        }
2980ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        scanInfo[len] = '\0';  /* null terminate the string */
2990ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    }
3000ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    close(hdmiScanInfoFile);
3010ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
3020ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    /*
3030ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R     * The scan_info contains the three fields
3040ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R     * PT - preferred video format
3050ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R     * IT - video format
3060ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R     * CE video format - containing the underscan support information
3070ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R     */
3080ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
3090ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    /* PT */
3100ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    ce_info_str = strtok(scanInfo, token);
3110ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    if (ce_info_str) {
3120ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        /* IT */
3130ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        ce_info_str = strtok(NULL, token);
3140ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        if (ce_info_str) {
3150ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            /* CE */
3160ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            ce_info_str = strtok(NULL, token);
3170ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            if (ce_info_str)
3180ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R                ce_info = atoi(ce_info_str);
3190ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        }
3200ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    }
3210ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
3220ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    if (ce_info_str) {
3230ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        // ce_info contains the underscan information
3240ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        if (ce_info == EXT_SCAN_ALWAYS_UNDERSCANED ||
3250ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            ce_info == EXT_SCAN_BOTH_SUPPORTED)
3260ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            // if TV supported underscan, then driver will always underscan
3270ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            // hence no need to apply action safe rectangle
3280ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            mUnderscanSupported = true;
3290ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    } else {
3300ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        ALOGE("%s: scan_info string error", __FUNCTION__);
3310ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    }
3320ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
3330ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    // Store underscan support info in a system property
3340ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    const char* prop = (mUnderscanSupported) ? "1" : "0";
3350ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    property_set("hw.underscan_supported", prop);
3360ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    return;
3370ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R}
3380ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R
3391589dee5c27293d278d3e549af8a4bda27e080f8Naseer AhmedExternalDisplay::~ExternalDisplay()
3401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
34156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    delete [] supported_video_mode_lut;
342080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    closeFrameBuffer();
343ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
344ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
34556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R/*
34656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * sets the fb_var_screeninfo from the hdmi_mode_timing_info
34756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R */
34856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.Rvoid setDisplayTiming(struct fb_var_screeninfo &info,
34956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                                const msm_hdmi_mode_timing_info* mode)
350ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
351ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    info.reserved[0] = 0;
352ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    info.reserved[1] = 0;
353ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    info.reserved[2] = 0;
354e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifndef FB_METADATA_VIDEO_INFO_CODE_SUPPORT
35556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.reserved[3] = (info.reserved[3] & 0xFFFF) |
35656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R              (mode->video_format << 16);
357e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif
358ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    info.xoffset = 0;
359ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    info.yoffset = 0;
36056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.xres = mode->active_h;
36156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.yres = mode->active_v;
36256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R
36356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.pixclock = (mode->pixel_freq)*1000;
36456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.vmode = mode->interlaced ?
36556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                    FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED;
36656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R
36756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.right_margin = mode->front_porch_h;
36856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.hsync_len = mode->pulse_width_h;
36956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.left_margin = mode->back_porch_h;
37056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.lower_margin = mode->front_porch_v;
37156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.vsync_len = mode->pulse_width_v;
37256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    info.upper_margin = mode->back_porch_v;
37356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R}
3741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
375080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes)
376ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
377ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    char delim = ',';
378ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    int count = 0;
379ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    char *start, *end;
380ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // EDIDs are string delimited by ','
381ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // Ex: 16,4,5,3,32,34,1
382ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // Parse this string to get mode(int)
383ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    start = (char*) edidStr;
384080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    end = &delim;
385080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    while(*end == delim) {
386080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        edidModes[count] = (int) strtol(start, &end, 10);
387ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        start = end+1;
388ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        count++;
389ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
390080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count);
391080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    for (int i = 0; i < count; i++)
392080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]);
393ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    return count;
394ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
395080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed
3961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::readResolution()
397ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
3989d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    char sysFsEDIDFilePath[MAX_SYSFS_FILE_PATH];
3999d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(sysFsEDIDFilePath , sizeof(sysFsEDIDFilePath),
4009d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            "/sys/devices/virtual/graphics/fb%d/edid_modes", mHdmiFbNum);
401620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
402620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0);
403ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    int len = -1;
404ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
405ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    if (hdmiEDIDFile < 0) {
406080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        ALOGE("%s: edid_modes file '%s' not found",
407620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                 __FUNCTION__, sysFsEDIDFilePath);
408ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        return false;
409ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    } else {
410ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1);
4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d",
4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                 __FUNCTION__, mEDIDs, len);
413ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        if ( len <= 0) {
414080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            ALOGE("%s: edid_modes file empty '%s'",
415620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                     __FUNCTION__, sysFsEDIDFilePath);
416ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
417ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        else {
418ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            while (len > 1 && isspace(mEDIDs[len-1]))
419ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed                --len;
420ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            mEDIDs[len] = 0;
421ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
422ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
423ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    close(hdmiEDIDFile);
424ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    if(len > 0) {
425620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        // Get EDID modes from the EDID strings
426080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        mModeCount = parseResolution(mEDIDs, mEDIDModes);
4271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__,
4281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                 mModeCount);
429ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
430ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
431ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    return (strlen(mEDIDs) > 0);
432ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
433ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
434620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum)
435ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
436080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    if (mFd == -1) {
437620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        mFd = open(msmFbDevicePath[fbNum-1], O_RDWR);
438080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        if (mFd < 0)
439620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            ALOGE("%s: %s is not available", __FUNCTION__,
440620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                                            msmFbDevicePath[fbNum-1]);
441620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        if(mHwcContext) {
44290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            mHwcContext->dpyAttr[mExtDpyNum].fd = mFd;
443620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        }
4442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
445080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    return (mFd > 0);
446080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed}
447080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed
448080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedbool ExternalDisplay::closeFrameBuffer()
449080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{
450080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    int ret = 0;
45150e19d2c536783fad3c29f8ffced6ba5915e7f06Naseer Ahmed    if(mFd >= 0) {
452080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        ret = close(mFd);
453080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        mFd = -1;
454ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
4552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if(mHwcContext) {
45690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        mHwcContext->dpyAttr[mExtDpyNum].fd = mFd;
4572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
458080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    return (ret == 0);
459ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
460ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
461080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed// clears the vinfo, edid, best modes
462080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedvoid ExternalDisplay::resetInfo()
463080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{
464080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    memset(&mVInfo, 0, sizeof(mVInfo));
465080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    memset(mEDIDs, 0, sizeof(mEDIDs));
466080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    memset(mEDIDModes, 0, sizeof(mEDIDModes));
467080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    mModeCount = 0;
468080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    mCurrentMode = -1;
4690ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    mUnderscanSupported = false;
4700ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    // Reset the underscan supported system property
4710ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    const char* prop = "0";
4720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R    property_set("hw.underscan_supported", prop);
473080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed}
474ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
4751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getModeOrder(int mode)
476ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
477c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    // XXX: We dont support interlaced modes but having
47856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    // it here for future
479ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    switch (mode) {
480ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        default:
48156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x480i60_4_3:
482ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            return 1; // 480i 4:3
48356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x480i60_16_9:
484ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            return 2; // 480i 16:9
48556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x576i50_4_3:
486ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            return 3; // i576i 4:3
48756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x576i50_16_9:
488ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            return 4; // 576i 16:9
489ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R        case HDMI_VFRMT_1920x1080i60_16_9:
490ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 5; // 1080i 16:9
49156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_640x480p60_4_3:
492ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 6; // 640x480 4:3
49356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x480p60_4_3:
494ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 7; // 480p 4:3
49556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x480p60_16_9:
496ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 8; // 480p 16:9
49756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x576p50_4_3:
498ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 9; // 576p 4:3
49956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x576p50_16_9:
500ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 10; // 576p 16:9
501ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R        case HDMI_VFRMT_1280x1024p60_5_4:
502ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 11; // 1024p; Vesa format
50356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1280x720p50_16_9:
504ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 12; // 720p@50Hz
50556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1280x720p60_16_9:
506ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 13; // 720p@60Hz
50756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p24_16_9:
508ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 14; //1080p@24Hz
50956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p25_16_9:
510ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 15; //108-p@25Hz
51156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p30_16_9:
512ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 16; //1080p@30Hz
51356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p50_16_9:
514ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 17; //1080p@50Hz
51556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p60_16_9:
516ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            return 18; //1080p@60Hz
51793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_2560x1600p60_16_9:
51893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            return 19; //WQXGA@60Hz541
51993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_3840x2160p24_16_9:
52093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            return 20;//2160@24Hz
52193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_3840x2160p25_16_9:
52293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            return 21;//2160@25Hz
52393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_3840x2160p30_16_9:
52493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            return 22; //2160@30Hz
52593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_4096x2160p24_16_9:
52693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            return 23; //4kx2k@24Hz
5271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
528ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
529ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
530c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R/// Returns the user mode set(if any) using adb shell
531c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rint ExternalDisplay::getUserMode() {
532c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    /* Based on the property set the resolution */
533c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    char property_value[PROPERTY_VALUE_MAX];
53496b413618bcdd213927494ca85f022bc78bbc60fArun Kumar K.R    property_get("hw.hdmi.resolution", property_value, "-1");
535c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    int mode = atoi(property_value);
536c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    // We dont support interlaced modes
537c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    if(isValidMode(mode) && !isInterlacedMode(mode)) {
53859644b2127280052ca410cb053f0a41c3181a97aNaseer Ahmed        ALOGD_IF(DEBUG, "%s: setting the HDMI mode = %d", __FUNCTION__, mode);
539c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        return mode;
540c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    }
541c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    return -1;
542c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R}
543c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R
544ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Get the best mode for the current HD TV
5451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getBestMode() {
546ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    int bestOrder = 0;
54756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R    int bestMode = HDMI_VFRMT_640x480p60_4_3;
548bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    Mutex::Autolock lock(mExtDispLock);
549ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // for all the edid read, get the best mode
550ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    for(int i = 0; i < mModeCount; i++) {
551ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        int mode = mEDIDModes[i];
552ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        int order = getModeOrder(mode);
553ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        if (order > bestOrder) {
554ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            bestOrder = order;
555ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            bestMode = mode;
556ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
557ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
558ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    return bestMode;
5591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
560ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
5611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID)
562ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
563c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    bool valid = false;
564c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    for (int i = 0; i < mModeCount; i++) {
565c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        if(ID == mEDIDModes[i]) {
566c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R            valid = true;
567c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R            break;
568c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        }
569c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    }
570c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    return valid;
571c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R}
572c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R
573c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format
574c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) {
575c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    bool interlaced = false;
576c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    switch(ID) {
57756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x480i60_4_3:
57856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x480i60_16_9:
57956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x576i50_4_3:
58056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1440x576i50_16_9:
58156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080i60_16_9:
582c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R            interlaced = true;
583c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R        default:
584c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R            interlaced = false;
585c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    }
586c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    return interlaced;
587ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
588ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
5891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid ExternalDisplay::setResolution(int ID)
590ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
591ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    struct fb_var_screeninfo info;
592080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    int ret = 0;
593080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo);
594080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    if(ret < 0) {
595080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__,
596080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed                                                            strerror(errno));
597080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    }
598080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d),"
599080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            "(%d,%d,%d) %dMHz>", __FUNCTION__,
600080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            mVInfo.reserved[3], mVInfo.xres, mVInfo.yres,
601080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin,
602080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin,
603080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed            mVInfo.pixclock/1000/1000);
604c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R    //If its a new ID - update var_screeninfo
605080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    if ((isValidMode(ID)) && mCurrentMode != ID) {
60656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        const struct msm_hdmi_mode_timing_info *mode =
6071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed            &supported_video_mode_lut[0];
60856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        for (unsigned int i = 0; i < HDMI_VFRMT_MAX; ++i) {
60956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R            const struct msm_hdmi_mode_timing_info *cur =
61056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                                        &supported_video_mode_lut[i];
61156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R            if (cur->video_format == (uint32_t)ID) {
612ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed                mode = cur;
61356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R                break;
61456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R            }
615ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
61656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        setDisplayTiming(mVInfo, mode);
617080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d"
6181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed                 "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID,
61997133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R                 mode->video_format, mVInfo.xres, mVInfo.yres,
620080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed                 mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin,
621080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed                 mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin,
622080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed                 mVInfo.pixclock/1000/1000);
623e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifdef FB_METADATA_VIDEO_INFO_CODE_SUPPORT
624e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        struct msmfb_metadata metadata;
625e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        memset(&metadata, 0 , sizeof(metadata));
626e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        metadata.op = metadata_op_vic;
627e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        metadata.data.video_info_code = mode->video_format;
628e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        if (ioctl(mFd, MSMFB_METADATA_SET, &metadata) == -1) {
629e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang            ALOGD("In %s: MSMFB_METADATA_SET failed Err Str = %s",
630e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang                                                 __FUNCTION__, strerror(errno));
631e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang        }
632e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif
63397133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R        mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE;
63497133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R        ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo);
63597133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R        if(ret < 0) {
63697133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R            ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s",
63797133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R                                                 __FUNCTION__, strerror(errno));
63897133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R        }
639080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed        mCurrentMode = ID;
640ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
641ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
642ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
643620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum)
644ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
645ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    hwc_context_t* ctx = mHwcContext;
646ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    if(ctx) {
647620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected);
648ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        // Store the external display
649620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        mConnected = connected;
650620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        mConnectedFbNum = extFbNum;
65190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        mHwcContext->dpyAttr[mExtDpyNum].connected = connected;
652620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        // Update external fb number in Overlay context
653620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        overlay::Overlay::getInstance()->setExtFbNum(extFbNum);
654ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
655620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
656620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
657620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) {
658620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    int ret = -1;
659620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mConnected) {
660620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        fbNum = mConnectedFbNum;
661620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ret = 0;
662620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
663620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    return ret;
664ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
665ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
6661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const
667ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
668ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    bool ret = true;
6699d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    char sysFsHPDFilePath[MAX_SYSFS_FILE_PATH];
6709d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R    snprintf(sysFsHPDFilePath ,sizeof(sysFsHPDFilePath),
6719d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R            "/sys/devices/virtual/graphics/fb%d/hpd", mHdmiFbNum);
672620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0);
673ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    if (hdmiHPDFile < 0) {
674620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__,
675620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                                sysFsHPDFilePath, hdmiHPDFile, strerror(errno));
676ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        ret = false;
677ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    } else {
678ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        int err = -1;
679620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption);
680ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        if(userOption)
681ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            err = write(hdmiHPDFile, "1", 2);
682ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        else
683ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            err = write(hdmiHPDFile, "0" , 2);
684ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        if (err <= 0) {
685620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar            ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath);
686ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed            ret = false;
687ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
688ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        close(hdmiHPDFile);
689ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
690ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    return ret;
691ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
692080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed
693620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() {
694620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    if(mHwcContext) {
69590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        mHwcContext->dpyAttr[mExtDpyNum].xres = mVInfo.xres;
69690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        mHwcContext->dpyAttr[mExtDpyNum].yres = mVInfo.yres;
69790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar        mHwcContext->dpyAttr[mExtDpyNum].vsync_period =
698620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar                1000000000l /60;
699620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar        ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__);
700620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar    }
701620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar}
702620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar
703620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() {
7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int width = 0, height = 0, fps = 0;
7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    getAttrForMode(width, height, fps);
7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    if(mHwcContext) {
70776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height);
7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width;
7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height;
71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period =
71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            1000000000l / fps;
7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    }
7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
715620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) {
7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    switch (mCurrentMode) {
71756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_640x480p60_4_3:
7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 640;
7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 480;
7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 60;
7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
72256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x480p60_4_3:
72356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x480p60_16_9:
7242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 720;
7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 480;
7262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 60;
7272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
72856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x576p50_4_3:
72956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_720x576p50_16_9:
7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 720;
7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 576;
7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 50;
7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
73456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1280x720p50_16_9:
7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1280;
7362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 720;
7372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 50;
7382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
73956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1280x720p60_16_9:
7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1280;
7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 720;
7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 60;
7432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
744ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R        case HDMI_VFRMT_1280x1024p60_5_4:
745ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            width = 1280;
746ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            height = 1024;
747ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            fps = 60;
748ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R            break;
74956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p24_16_9:
7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1920;
7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 1080;
7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 24;
7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
75456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p25_16_9:
7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1920;
7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 1080;
7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 25;
7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
75956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p30_16_9:
7602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1920;
7612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 1080;
7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 30;
7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
76456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p50_16_9:
7652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1920;
7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 1080;
7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 50;
7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
76956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R        case HDMI_VFRMT_1920x1080p60_16_9:
7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            width = 1920;
7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            height = 1080;
7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            fps = 60;
7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah            break;
77493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_2560x1600p60_16_9:
77593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            width = 2560;
77693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            height = 1600;
77793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            fps = 60;
77893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            break;
77993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_3840x2160p24_16_9:
78093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            width = 3840;
78193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            height = 2160;
78293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            fps = 24;
78393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            break;
784d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R        case HDMI_VFRMT_3840x2160p25_16_9:
785d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R            width = 3840;
786d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R            height = 2160;
787d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R            fps = 25;
788d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R            break;
78993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_3840x2160p30_16_9:
79093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            width = 3840;
79193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            height = 2160;
79293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            fps = 30;
79393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            break;
79493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel        case HDMI_VFRMT_4096x2160p24_16_9:
79593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            width = 4096;
79693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            height = 2160;
79793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            fps = 24;
79893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel            break;
79993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel
800080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    }
801080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed}
802080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed
803ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed};
804