171005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R
21589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed/*
31589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
4f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R * Copyright (C) 2012-14, The Linux Foundation. All rights reserved.
51589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed *
61589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * Not a Contribution, Apache license notifications and license are
71589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * retained for attribution purposes only.
81589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
91589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * you may not use this file except in compliance with the License.
111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * You may obtain a copy of the License at
121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed *
131589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed *
151589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
161589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
171589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * See the License for the specific language governing permissions and
191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed * limitations under the License.
201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed */
2125322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah#define UEVENT_DEBUG 0
221589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <hardware_legacy/uevent.h>
231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <utils/Log.h>
241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <sys/resource.h>
25aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed#include <sys/prctl.h>
261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <string.h>
271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <stdlib.h>
281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include "hwc_utils.h"
29640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah#include "hwc_fbupdate.h"
30f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran#include "hwc_mdpcomp.h"
314019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h"
324019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "comptype.h"
33bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h"
34361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran#include "virtual.h"
35f1ea15e3c689d155626a56b870ee78cf4041b28dTatenda Chipeperekwa#include "hwc_virtual.h"
362e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah#include "mdp_version.h"
374d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumarusing namespace overlay;
381589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace qhwc {
39aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar#define HWC_UEVENT_SWITCH_STR  "change@/devices/virtual/switch/"
408eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev#define HWC_UEVENT_THREAD_NAME "hwcUeventThread"
418eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev
42361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic void setup(hwc_context_t* ctx, int dpy)
43aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar{
44f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    ctx->mFBUpdate[dpy] = IFBUpdate::getObject(ctx, dpy);
45f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah    ctx->mMDPComp[dpy] =  MDPComp::getObject(ctx, dpy);
46aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar}
47aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar
48aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumarstatic void clear(hwc_context_t* ctx, int dpy)
49aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar{
50aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    if(ctx->mFBUpdate[dpy]) {
51aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        delete ctx->mFBUpdate[dpy];
52aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar        ctx->mFBUpdate[dpy] = NULL;
53aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    }
54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran    if(ctx->mMDPComp[dpy]) {
55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        delete ctx->mMDPComp[dpy];
56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran        ctx->mMDPComp[dpy] = NULL;
57aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar    }
58aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar}
59aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar
60361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran/* Parse uevent data for devices which we are interested */
61361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int getConnectedDisplay(const char* strUdata)
621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
63361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(strcasestr("change@/devices/virtual/switch/hdmi", strUdata))
64361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_EXTERNAL;
65361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(strcasestr("change@/devices/virtual/switch/wfd", strUdata))
66361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        return HWC_DISPLAY_VIRTUAL;
67361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return -1;
68361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
694019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R
7027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic bool getPanelResetStatus(hwc_context_t* ctx, const char* strUdata, int len)
7127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{
7227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    const char* iter_str = strUdata;
7327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (strcasestr("change@/devices/virtual/graphics/fb0", strUdata)) {
7427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        while(((iter_str - strUdata) <= len) && (*iter_str)) {
75eaca5edc6c0313c01b0ae40dda9eaa29ed3b33f2Dan Austin            const char* pstr = strstr(iter_str, "PANEL_ALIVE=0");
7627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran            if (pstr != NULL) {
770938709ed5efbf73eafbaed31bf069f4e9dfd427Arpita Banerjee                ALOGI("%s: got change event in fb0 with PANEL_ALIVE=0",
7827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                                                           __FUNCTION__);
7927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                ctx->mPanelResetStatus = true;
8027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran                return true;
8127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran            }
8227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran            iter_str += strlen(iter_str)+1;
8327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        }
8427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
8527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    return false;
8627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran}
8727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
88361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran/* Parse uevent data for action requested for the display */
89361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic int getConnectedState(const char* strUdata, int len)
90361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{
91361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    const char* iter_str = strUdata;
92361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    while(((iter_str - strUdata) <= len) && (*iter_str)) {
93eaca5edc6c0313c01b0ae40dda9eaa29ed3b33f2Dan Austin        const char* pstr = strstr(iter_str, "SWITCH_STATE=");
94361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        if (pstr != NULL) {
95361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            return (atoi(pstr + strlen("SWITCH_STATE=")));
96361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
97361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        iter_str += strlen(iter_str)+1;
984019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    }
99361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    return -1;
100361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran}
101361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
102f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_pause(hwc_context_t* ctx, int dpy) {
103f1ea15e3c689d155626a56b870ee78cf4041b28dTatenda Chipeperekwa    if(ctx->mHWCVirtual) {
104f1ea15e3c689d155626a56b870ee78cf4041b28dTatenda Chipeperekwa        ctx->mHWCVirtual->pause(ctx, dpy);
105f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R    }
106f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R    return;
107f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R}
108f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R
109f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_resume(hwc_context_t* ctx, int dpy) {
110f1ea15e3c689d155626a56b870ee78cf4041b28dTatenda Chipeperekwa    if(ctx->mHWCVirtual) {
111f1ea15e3c689d155626a56b870ee78cf4041b28dTatenda Chipeperekwa        ctx->mHWCVirtual->resume(ctx, dpy);
112f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R    }
113f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R    return;
114f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R}
115f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R
1160d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVMstatic void teardownWfd(hwc_context_t* ctx) {
1170d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    // Teardown WFD display
1180d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    ALOGD_IF(UEVENT_DEBUG,"Received HDMI connection request when WFD is "
1190d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM            "active");
1200d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    {
1210d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        Locker::Autolock _l(ctx->mDrawLock);
1220d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        clear(ctx, HWC_DISPLAY_VIRTUAL);
1230d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected = false;
1240d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = false;
1250d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    }
1260d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM
1270d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    ctx->mVirtualDisplay->teardown();
1280d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM
1290d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    /* Need to send hotplug only when connected WFD in proprietary path */
1300d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    if(ctx->mVirtualonExtActive) {
1310d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        ALOGE_IF(UEVENT_DEBUG,"%s: Sending EXTERNAL OFFLINE"
1320d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                "hotplug event for wfd display", __FUNCTION__);
1330d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        ctx->proc->hotplug(ctx->proc, HWC_DISPLAY_EXTERNAL,
1340d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                EXTERNAL_OFFLINE);
1350d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        {
1360d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM            Locker::Autolock _l(ctx->mDrawLock);
1370d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM            ctx->mVirtualonExtActive = false;
1380d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM        }
1390d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM    }
140e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal
141af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah    ctx->mWfdSyncLock.lock();
142af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah    ALOGD_IF(HWC_WFDDISPSYNC_LOG,
143af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah            "%s: Waiting for wfd-teardown to be signalled",__FUNCTION__);
144af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah    ctx->mWfdSyncLock.wait();
145af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah    ALOGD_IF(HWC_WFDDISPSYNC_LOG,
146af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah            "%s: Teardown signalled. Completed waiting in uevent thread",
147af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah            __FUNCTION__);
148af497507a296d3280b6bcd231223d623ef4ef15fSaurabh Shah    ctx->mWfdSyncLock.unlock();
1490d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM}
1500d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM
151361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranstatic void handle_uevent(hwc_context_t* ctx, const char* udata, int len)
152361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran{
15327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    bool bpanelReset = getPanelResetStatus(ctx, udata, len);
15427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    if (bpanelReset) {
15568a883e886b98f679b7a8acc068b569068952388radhakrishna        ctx->proc->invalidate(ctx->proc);
15627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran        return;
15727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran    }
15827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran
159361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int dpy = getConnectedDisplay(udata);
160361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    if(dpy < 0) {
161361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        ALOGD_IF(UEVENT_DEBUG, "%s: Not disp Event ", __FUNCTION__);
1621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        return;
163080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    }
16490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar
165361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    int switch_state = getConnectedState(udata, len);
16690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar
167e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal    ALOGE_IF(UEVENT_DEBUG,"%s: uevent received: %s switch state: %d",
168361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran             __FUNCTION__,udata, switch_state);
16990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar
170361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    switch(switch_state) {
171361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case EXTERNAL_OFFLINE:
172361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        {
173361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            /* Display not connected */
174361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(!ctx->dpyAttr[dpy].connected){
175361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ALOGE_IF(UEVENT_DEBUG,"%s: Ignoring EXTERNAL_OFFLINE event"
176361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                         "for display: %d", __FUNCTION__, dpy);
177361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                break;
178361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
179aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar
1801a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            Locker::Autolock _l(ctx->mDrawLock);
181361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            clear(ctx, dpy);
182361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].connected = false;
183361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isActive = false;
18471005afe9fda149b1bdd2720d0aed1414dc5a455Arun Kumar K.R
185361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(dpy == HWC_DISPLAY_EXTERNAL) {
186361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mExtDisplay->teardown();
187361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            } else {
188361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mVirtualDisplay->teardown();
189361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
190361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
191361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            /* We need to send hotplug to SF only when we are disconnecting
192361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran             * (1) HDMI OR (2) proprietary WFD session */
193361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(dpy == HWC_DISPLAY_EXTERNAL ||
194361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran               ctx->mVirtualonExtActive) {
195361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ALOGE_IF(UEVENT_DEBUG,"%s:Sending EXTERNAL OFFLINE hotplug"
196361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                         "event", __FUNCTION__);
197361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->proc->hotplug(ctx->proc, HWC_DISPLAY_EXTERNAL,
198361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                                   EXTERNAL_OFFLINE);
199f80fbc4eef0e43a1455a74a3cdfd563ea4a9b8e5Manoj Kumar AVM                ctx->mVirtualonExtActive = false;
2005a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed                ctx->mQService->onHdmiHotplug((int)ctx->dpyAttr[dpy].connected);
201361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
202361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            break;
203361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
204361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    case EXTERNAL_ONLINE:
205361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        {
206361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            /* Display already connected */
207361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(ctx->dpyAttr[dpy].connected) {
208361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ALOGE_IF(UEVENT_DEBUG,"%s: Ignoring EXTERNAL_ONLINE event"
209361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                         "for display: %d", __FUNCTION__, dpy);
21090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar                break;
211640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            }
212361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            {
213361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //Force composition to give up resources like pipes and
214361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //close fb. For example if assertive display is going on,
215361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //fb2 could be open, thus connecting Layer Mixer#0 to
216361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //WriteBack module. If HDMI attempts to open fb1, the driver
217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //will try to attach Layer Mixer#0 to HDMI INT, which will
218361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //fail, since Layer Mixer#0 is still connected to WriteBack.
219361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //This block will force composition to close fb2 in above
220361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                //example.
2211a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                Locker::Autolock _l(ctx->mDrawLock);
222361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->dpyAttr[dpy].isConfiguring = true;
223361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->proc->invalidate(ctx->proc);
224361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
225361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            //2 cycles for slower content
226361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            usleep(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period
227361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                   * 2 / 1000);
228361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
229361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(dpy == HWC_DISPLAY_EXTERNAL) {
230361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) {
2310d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    // Triple Display is supported on 8084 target
2320d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    // WFD can be initiated by Wfd-client or Settings app
2330d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    // 1. wfd-client use hdmi hotplug mechanism.
2340d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    If wfd is connected via wfd-client and if HDMI is
2350d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    connected, we have to teardown wfd session.
2360d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    (as SF support only one active External display
2370d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //     at a given time).
2380d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    (ToDo: Once wfd-client migrates using virtual display
2390d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //     apis, second condition is redundant).
2400d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    // 2. Settings app use virtual display mechanism.
2410d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    In this approach, there is no limitation of supporting
2420d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    //    triple display.
2430d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                    if(!(qdutils::MDPVersion::getInstance().is8084() &&
2440d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                                !ctx->mVirtualonExtActive)) {
2450d5be37208f95ad90a135f037f3ee566fdbe00e7Manoj Kumar AVM                        teardownWfd(ctx);
246aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar                    }
247aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar                }
248361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mExtDisplay->configure();
249361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            } else {
2507351e690989ae638e281be1999b002b3333cd403Saurabh Shah                {
2511a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah                    Locker::Autolock _l(ctx->mDrawLock);
252361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    /* TRUE only when we are on proprietary WFD session */
253361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    ctx->mVirtualonExtActive = true;
254361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    char property[PROPERTY_VALUE_MAX];
255361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    if((property_get("persist.sys.wfd.virtual",
256361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                                                  property, NULL) > 0) &&
257361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                       (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
258361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                       (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
259361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        // This means we are on Google's WFD session
260361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                        ctx->mVirtualonExtActive = false;
261361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                    }
2627351e690989ae638e281be1999b002b3333cd403Saurabh Shah                }
263361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->mVirtualDisplay->configure();
264361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
265361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
2661a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah            Locker::Autolock _l(ctx->mDrawLock);
267361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            setup(ctx, dpy);
268361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isPause = false;
269361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].connected = true;
270361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ctx->dpyAttr[dpy].isConfiguring = true;
271361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran
272361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            if(dpy == HWC_DISPLAY_EXTERNAL ||
273361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran               ctx->mVirtualonExtActive) {
274bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                /* External display is HDMI or non-hybrid WFD solution */
275361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ALOGE_IF(UEVENT_DEBUG, "%s: Sending EXTERNAL_OFFLINE ONLINE"
276361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                         "hotplug event", __FUNCTION__);
277361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                ctx->proc->hotplug(ctx->proc,HWC_DISPLAY_EXTERNAL,
278361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran                                   EXTERNAL_ONLINE);
2795a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed                ctx->mQService->onHdmiHotplug(ctx->dpyAttr[dpy].connected);
280bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal            } else {
281bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                /* We wont be getting unblank for VIRTUAL DISPLAY and its
282bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                 * always guaranteed from WFD stack that CONNECT uevent for
283bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                 * VIRTUAL DISPLAY will be triggered before creating
284bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                 * surface for the same. */
285bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal                ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = true;
286361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            }
287361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            break;
288361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
2894d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        case EXTERNAL_PAUSE:
2904d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            {   // pause case
2914d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGD("%s Received Pause event",__FUNCTION__);
292f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R                handle_pause(ctx, dpy);
293f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R                break;
29490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar            }
2954d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar        case EXTERNAL_RESUME:
2964d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar            {  // resume case
2974d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                ALOGD("%s Received resume event",__FUNCTION__);
2984d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                //Treat Resume as Online event
2994d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                //Since external didnt have any pipes, force primary to give up
3004d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                //its pipes; we don't allow inter-mixer pipe transfers.
301f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R                handle_resume(ctx, dpy);
3024d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar                break;
3034019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R            }
304361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran    default:
305361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        {
306361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            ALOGE("%s: Invalid state to swtich:%d", __FUNCTION__, switch_state);
307361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran            break;
308361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran        }
3091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedstatic void *uevent_loop(void *param)
3131589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    int len = 0;
315aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    static char udata[PAGE_SIZE];
3161589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    hwc_context_t * ctx = reinterpret_cast<hwc_context_t *>(param);
3178eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    char thread_name[64] = HWC_UEVENT_THREAD_NAME;
318aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    prctl(PR_SET_NAME, (unsigned long) &thread_name, 0, 0, 0);
3191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY);
3203d289231341a3f4b39af1230038272692a30dfaaSravan Kumar D.V.N    if(!uevent_init()) {
3213d289231341a3f4b39af1230038272692a30dfaaSravan Kumar D.V.N        ALOGE("%s: failed to init uevent ",__FUNCTION__);
3223d289231341a3f4b39af1230038272692a30dfaaSravan Kumar D.V.N        return NULL;
3233d289231341a3f4b39af1230038272692a30dfaaSravan Kumar D.V.N    }
3241589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    while(1) {
3263d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu        len = uevent_next_event(udata, (int)sizeof(udata) - 2);
3271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed        handle_uevent(ctx, udata, len);
3281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    }
3291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3301589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    return NULL;
3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx)
3341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{
3351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    pthread_t uevent_thread;
3368eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    int ret;
3378eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev
3388eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ALOGI("Initializing UEVENT Thread");
3398eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    ret = pthread_create(&uevent_thread, NULL, uevent_loop, (void*) ctx);
3408eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    if (ret) {
3418eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev        ALOGE("%s: failed to create %s: %s", __FUNCTION__,
3428eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev            HWC_UEVENT_THREAD_NAME, strerror(ret));
3438eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev    }
3441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
3451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
3461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}; //namespace
347