1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2013 The Linux Foundation. All rights reserved. 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Redistribution and use in source and binary forms, with or without 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* modification, are permitted provided that the following conditions are 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* met: 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Redistributions of source code must retain the above copyright 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* notice, this list of conditions and the following disclaimer. 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Redistributions in binary form must reproduce the above 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* copyright notice, this list of conditions and the following 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* disclaimer in the documentation and/or other materials provided 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* with the distribution. 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* * Neither the name of The Linux Foundation. nor the names of its 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* contributors may be used to endorse or promote products derived 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* from this software without specific prior written permission. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/ 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlay.h" 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayWriteback.h" 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "mdpWrapper.h" 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define SIZE_1M 0x00100000 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay { 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//=========== class WritebackMem ============================================== 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool WritebackMem::manageMem(uint32_t size, bool isSecure) { 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mBuf.bufSz() == size) { 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mBuf.valid()) { 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mBuf.close()) { 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s error closing mem", __func__); 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return alloc(size, isSecure); 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool WritebackMem::alloc(uint32_t size, bool isSecure) { 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mBuf.open(NUM_BUFS, size, isSecure)){ 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Failed to open", __func__); 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mBuf.close(); 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin OVASSERT(MAP_FAILED != mBuf.addr(), "MAP failed"); 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin OVASSERT(mBuf.getFD() != -1, "getFd is -1"); 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mCurrOffsetIndex = 0; 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for (uint32_t i = 0; i < NUM_BUFS; i++) { 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOffsets[i] = i * size; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool WritebackMem::dealloc() { 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool ret = true; 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mBuf.valid()) { 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ret = mBuf.close(); 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return ret; 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//=========== class Writeback ================================================= 78054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinWriteback::Writeback() : mXres(0), mYres(0), mOpFmt(-1), mSecure(false) { 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int fbNum = Overlay::getFbForDpy(Overlay::DPY_WRITEBACK); 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!utils::openDev(mFd, fbNum, Res::fbPath, O_RDWR)) { 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s failed to init %s", __func__, Res::fbPath); 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return; 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin startSession(); 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 87054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinWriteback::~Writeback() { 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin stopSession(); 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!mFd.close()) { 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s error closing fd", __func__); 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::startSession() { 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::wbInitStart(mFd.getFD())) { 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s failed", __func__); 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::stopSession() { 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mFd.valid()) { 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!Overlay::displayCommit(mFd.getFD())) { 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: displayCommit failed", __func__); 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::wbStopTerminate(mFd.getFD())) { 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: wbStopTerminate failed", __func__); 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s Invalid fd", __func__); 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::configureDpyInfo(int xres, int yres) { 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mXres != xres || mYres != yres) { 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin fb_var_screeninfo vinfo; 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&vinfo, 0, sizeof(fb_var_screeninfo)); 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::getVScreenInfo(mFd.getFD(), vinfo)) { 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s failed", __func__); 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.xres = xres; 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.yres = yres; 129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.xres_virtual = xres; 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.yres_virtual = yres; 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.xoffset = 0; 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin vinfo.yoffset = 0; 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::setVScreenInfo(mFd.getFD(), vinfo)) { 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s failed", __func__); 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mXres = xres; 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mYres = yres; 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::configureMemory(uint32_t size) { 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mWbMem.manageMem(size, mSecure)) { 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s failed, memory failure", __func__); 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::queueBuffer(int opFd, uint32_t opOffset) { 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&mFbData, 0, sizeof(struct msmfb_data)); 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Queue 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFbData.offset = opOffset; 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFbData.memory_id = opFd; 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFbData.id = 0; 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFbData.flags = 0; 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::wbQueueBuffer(mFd.getFD(), mFbData)) { 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: queuebuffer failed", __func__); 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::dequeueBuffer() { 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Dequeue 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mFbData.flags = MSMFB_WRITEBACK_DEQUEUE_BLOCKING; 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!mdp_wrapper::wbDequeueBuffer(mFd.getFD(), mFbData)) { 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: dequeuebuffer failed", __func__); 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::writeSync(int opFd, uint32_t opOffset) { 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!queueBuffer(opFd, opOffset)) { 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!Overlay::displayCommit(mFd.getFD())) { 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!dequeueBuffer()) { 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::writeSync() { 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mWbMem.useNextBuffer(); 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return writeSync(mWbMem.getDstFd(), mWbMem.getOffset()); 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::setOutputFormat(int mdpFormat) { 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mdpFormat != mOpFmt) { 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct msmfb_metadata metadata; 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&metadata, 0 , sizeof(metadata)); 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin metadata.op = metadata_op_wb_format; 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin metadata.data.mixer_cfg.writeback_format = mdpFormat; 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ioctl(mFd.getFD(), MSMFB_METADATA_SET, &metadata) < 0) { 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error setting MDP Writeback format"); 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOpFmt = mdpFormat; 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint Writeback::getOutputFormat() { 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(mOpFmt < 0) { 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct msmfb_metadata metadata; 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&metadata, 0 , sizeof(metadata)); 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin metadata.op = metadata_op_wb_format; 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ioctl(mFd.getFD(), MSMFB_METADATA_GET, &metadata) < 0) { 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error retrieving MDP Writeback format"); 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -1; 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mOpFmt = metadata.data.mixer_cfg.writeback_format; 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return mOpFmt; 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::setSecure(bool isSecure) { 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(isSecure != mSecure) { 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Call IOCTL to set WB interface as secure 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct msmfb_metadata metadata; 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(&metadata, 0 , sizeof(metadata)); 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin metadata.op = metadata_op_wb_secure; 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin metadata.data.secure_en = isSecure; 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ioctl(mFd.getFD(), MSMFB_METADATA_SET, &metadata) < 0) { 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error setting MDP WB secure"); 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mSecure = isSecure; 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//static 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 240054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinWriteback *Writeback::getInstance() { 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(sWb == NULL) { 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sWb = new Writeback(); 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sUsed = true; 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return sWb; 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid Writeback::configDone() { 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(sUsed == false && sWb) { 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delete sWb; 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sWb = NULL; 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid Writeback::clear() { 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sUsed = false; 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(sWb) { 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delete sWb; 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sWb = NULL; 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::getDump(char *buf, size_t len) { 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(sWb) { 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::getDump(buf, len, "WBData", sWb->mFbData); 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin char outputBufferInfo[256]; 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin snprintf(outputBufferInfo, sizeof(outputBufferInfo), 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin "OutputBuffer xres=%d yres=%d format=%s\n\n", 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin sWb->getWidth(), sWb->getHeight(), 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin utils::getFormatString(sWb->getOutputFormat())); 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin strlcat(buf, outputBufferInfo, len); 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return true; 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return false; 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 277054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinWriteback *Writeback::sWb = 0; 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool Writeback::sUsed = false; 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} //namespace overlay 281