176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah/* 276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* Copyright (c) 2013 The Linux Foundation. All rights reserved. 376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* 476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* Redistribution and use in source and binary forms, with or without 576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* modification, are permitted provided that the following conditions are 676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* met: 776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* * Redistributions of source code must retain the above copyright 876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* notice, this list of conditions and the following disclaimer. 976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* * Redistributions in binary form must reproduce the above 1076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* copyright notice, this list of conditions and the following 1176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* disclaimer in the documentation and/or other materials provided 1276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* with the distribution. 1376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* * Neither the name of The Linux Foundation. nor the names of its 1476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* contributors may be used to endorse or promote products derived 1576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* from this software without specific prior written permission. 1676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* 1776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah*/ 2976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 3076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include "overlay.h" 3176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include "overlayWriteback.h" 3276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include "mdpWrapper.h" 3376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 344cab76532675261b22d5b43541f63a01c555639fSaurabh Shah#define SIZE_1M 0x00100000 354cab76532675261b22d5b43541f63a01c555639fSaurabh Shah 3676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahnamespace overlay { 3776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 3876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah//=========== class WritebackMem ============================================== 3976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool WritebackMem::manageMem(uint32_t size, bool isSecure) { 4076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(mBuf.bufSz() == size) { 4176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 4276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 4376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(mBuf.valid()) { 4476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mBuf.close()) { 4576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s error closing mem", __func__); 4676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 4776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 4876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 4976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return alloc(size, isSecure); 5076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 5176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 5276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool WritebackMem::alloc(uint32_t size, bool isSecure) { 5376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mBuf.open(NUM_BUFS, size, isSecure)){ 5476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s: Failed to open", __func__); 5576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mBuf.close(); 5676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 5776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 5876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 5976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah OVASSERT(MAP_FAILED != mBuf.addr(), "MAP failed"); 6076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah OVASSERT(mBuf.getFD() != -1, "getFd is -1"); 6176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 6276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mCurrOffsetIndex = 0; 6376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah for (uint32_t i = 0; i < NUM_BUFS; i++) { 6476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mOffsets[i] = i * size; 6576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 6676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 6776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 6876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 6976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool WritebackMem::dealloc() { 7076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah bool ret = true; 7176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(mBuf.valid()) { 7276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ret = mBuf.close(); 7376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 7476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return ret; 7576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 7676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 7776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah//=========== class Writeback ================================================= 784b3227695dbfda6e12110f258b5b672807d642caTatenda ChipeperekwaWriteback::Writeback() : mXres(0), mYres(0), mOpFmt(-1), mSecure(false) { 7976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah int fbNum = Overlay::getFbForDpy(Overlay::DPY_WRITEBACK); 8076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!utils::openDev(mFd, fbNum, Res::fbPath, O_RDWR)) { 8176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed to init %s", __func__, Res::fbPath); 8276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return; 8376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 8476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah startSession(); 8576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 8676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 8776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh ShahWriteback::~Writeback() { 8876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah stopSession(); 8976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if (!mFd.close()) { 9076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s error closing fd", __func__); 9176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 9276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 9376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 9476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::startSession() { 9576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::wbInitStart(mFd.getFD())) { 9676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed", __func__); 9776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 9876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 9976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 10076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 10176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 10276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::stopSession() { 10376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(mFd.valid()) { 10476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::wbStopTerminate(mFd.getFD())) { 10576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed", __func__); 10676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 10776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 10876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } else { 10976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s Invalid fd", __func__); 11076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 11176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 11276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 11376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 11476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 11576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::configureDpyInfo(int xres, int yres) { 11676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(mXres != xres || mYres != yres) { 11776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah fb_var_screeninfo vinfo; 11876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah memset(&vinfo, 0, sizeof(fb_var_screeninfo)); 11976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::getVScreenInfo(mFd.getFD(), vinfo)) { 12076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed", __func__); 12176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 12276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 12376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.xres = xres; 12476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.yres = yres; 12576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.xres_virtual = xres; 12676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.yres_virtual = yres; 12776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.xoffset = 0; 12876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah vinfo.yoffset = 0; 12976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::setVScreenInfo(mFd.getFD(), vinfo)) { 13076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed", __func__); 13176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 13276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 13376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mXres = xres; 13476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mYres = yres; 13576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 13676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 13776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 13876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 1394b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwabool Writeback::configureMemory(uint32_t size) { 1404b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa if(!mWbMem.manageMem(size, mSecure)) { 14176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s failed, memory failure", __func__); 14276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 14376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 14476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 14576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 14676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 14776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::queueBuffer(int opFd, uint32_t opOffset) { 14876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah memset(&mFbData, 0, sizeof(struct msmfb_data)); 14976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //Queue 15076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mFbData.offset = opOffset; 15176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mFbData.memory_id = opFd; 15276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mFbData.id = 0; 15376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mFbData.flags = 0; 15476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::wbQueueBuffer(mFd.getFD(), mFbData)) { 15576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s: queuebuffer failed", __func__); 15676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 15776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 15876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 15976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 16076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 16176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::dequeueBuffer() { 16276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //Dequeue 16376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mFbData.flags = MSMFB_WRITEBACK_DEQUEUE_BLOCKING; 16476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!mdp_wrapper::wbDequeueBuffer(mFd.getFD(), mFbData)) { 16576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah ALOGE("%s: dequeuebuffer failed", __func__); 16676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 16776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 16876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 16976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 17076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 17176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::writeSync(int opFd, uint32_t opOffset) { 17276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!queueBuffer(opFd, opOffset)) { 17376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 17476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 17576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!Overlay::displayCommit(mFd.getFD())) { 17676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 17776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 17876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(!dequeueBuffer()) { 17976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return false; 18076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 18176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return true; 18276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 18376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 18476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::writeSync() { 18576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah mWbMem.useNextBuffer(); 18676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return writeSync(mWbMem.getDstFd(), mWbMem.getOffset()); 18776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 18876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 189bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shahbool Writeback::setOutputFormat(int mdpFormat) { 190bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah if(mdpFormat != mOpFmt) { 191bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah struct msmfb_metadata metadata; 192bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah memset(&metadata, 0 , sizeof(metadata)); 193bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah metadata.op = metadata_op_wb_format; 194bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah metadata.data.mixer_cfg.writeback_format = mdpFormat; 195bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah if (ioctl(mFd.getFD(), MSMFB_METADATA_SET, &metadata) < 0) { 196bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah ALOGE("Error setting MDP Writeback format"); 197bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah return false; 198bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah } 199bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah mOpFmt = mdpFormat; 200bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah } 201bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah return true; 202bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah} 203bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah 204bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shahint Writeback::getOutputFormat() { 205bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah if(mOpFmt < 0) { 206bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah struct msmfb_metadata metadata; 207bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah memset(&metadata, 0 , sizeof(metadata)); 208bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah metadata.op = metadata_op_wb_format; 209bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah if (ioctl(mFd.getFD(), MSMFB_METADATA_GET, &metadata) < 0) { 210bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah ALOGE("Error retrieving MDP Writeback format"); 211bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah return -1; 212bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah } 213bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah mOpFmt = metadata.data.mixer_cfg.writeback_format; 214f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah } 215bfc2dfa191ac4e0d8209a7441f28b3f3367bcf92Saurabh Shah return mOpFmt; 216f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah} 217f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 2184b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwabool Writeback::setSecure(bool isSecure) { 2194b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa if(isSecure != mSecure) { 2204b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa // Call IOCTL to set WB interface as secure 2214b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa struct msmfb_metadata metadata; 2224b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa memset(&metadata, 0 , sizeof(metadata)); 2234b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa metadata.op = metadata_op_wb_secure; 2244b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa metadata.data.secure_en = isSecure; 2254b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa if (ioctl(mFd.getFD(), MSMFB_METADATA_SET, &metadata) < 0) { 2264b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa ALOGE("Error setting MDP WB secure"); 2274b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa return false; 2284b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa } 2294b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa mSecure = isSecure; 2304b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa } 2314b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa return true; 2324b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa} 2334b3227695dbfda6e12110f258b5b672807d642caTatenda Chipeperekwa 23476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah//static 23576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 23676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh ShahWriteback *Writeback::getInstance() { 23776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(sWb == NULL) { 23876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sWb = new Writeback(); 23976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 24076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sUsed = true; 24176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return sWb; 24276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 24376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 24476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahvoid Writeback::configDone() { 24576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(sUsed == false && sWb) { 24676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah delete sWb; 24776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sWb = NULL; 24876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 24976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 25076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 25176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahvoid Writeback::clear() { 25276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sUsed = false; 25376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah if(sWb) { 25476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah delete sWb; 25576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah sWb = NULL; 25676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah } 25776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 25876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 259ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shahbool Writeback::getDump(char *buf, size_t len) { 260ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(sWb) { 261ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah utils::getDump(buf, len, "WBData", sWb->mFbData); 262ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah char str[4] = {'\0'}; 263ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah snprintf(str, 4, "\n"); 264c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan strlcat(buf, str, len); 265ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah return true; 266ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 267ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah return false; 268ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah} 269ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah 27076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh ShahWriteback *Writeback::sWb = 0; 27176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Writeback::sUsed = false; 27276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 27376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} //namespace overlay 274