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