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