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