1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
26e146950e61327d425750c1de36bfd70d526acadSushil Chauhan* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
3befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Redistribution and use in source and binary forms, with or without
5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* modification, are permitted provided that the following conditions are
6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* met:
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*    * Redistributions of source code must retain the above copyright
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      notice, this list of conditions and the following disclaimer.
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*    * Redistributions in binary form must reproduce the above
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      copyright notice, this list of conditions and the following
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      disclaimer in the documentation and/or other materials provided
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      with the distribution.
1347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed*    * Neither the name of The Linux Foundation nor the names of its
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      contributors may be used to endorse or promote products derived
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      from this software without specific prior written permission.
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*/
29befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
30072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah#include <dlfcn.h>
31befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlay.h"
3247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "pipes/overlayGenPipe.h"
3347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "mdp_version.h"
345d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#include "qdMetaData.h"
35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
3647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define PIPE_DEBUG 0
37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay {
3947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedusing namespace utils;
40314840035b55115a39d526cde009c678ccdacf40Saurabh Shahusing namespace qdutils;
41072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
4247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay::Overlay() {
43c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan    int numPipes = qdutils::MDPVersion::getInstance().getTotalPipes();
44c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan    PipeBook::NUM_PIPES = (numPipes <= utils::OV_MAX)? numPipes : utils::OV_MAX;
4547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        mPipeBook[i].init();
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
4947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mDumpStr[0] = '\0';
50072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    initScalar();
51531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal    setDMAMultiplexingSupported();
52f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed}
53f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed
54f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer AhmedOverlay::~Overlay() {
5547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
5647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        mPipeBook[i].destroy();
57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
58072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    destroyScalar();
59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
6147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::configBegin() {
6247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
6347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        //Mark as available for this round.
6447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        PipeBook::resetUse(i);
6547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        PipeBook::resetAllocation(i);
6647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    }
6747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mDumpStr[0] = '\0';
6847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
6947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
7047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::configDone() {
7147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
7225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam        if((PipeBook::isNotUsed(i) && !sessionInProgress((eDest)i)) ||
7325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam                    isSessionEnded((eDest)i)) {
7447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            //Forces UNSET on pipes, flushes rotator memory and session, closes
7547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            //fds
7647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            if(mPipeBook[i].valid()) {
7747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed                char str[32];
78c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan                snprintf(str, 32, "Unset=%s dpy=%d mix=%d; ",
791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                        PipeBook::getDestStr((eDest)i),
801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                        mPipeBook[i].mDisplay, mPipeBook[i].mMixer);
81d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG
82c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan                strlcat(mDumpStr, str, sizeof(mDumpStr));
83d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif
8447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            }
8547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            mPipeBook[i].destroy();
86f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed        }
87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
8847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    dump();
8947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    PipeBook::save();
9047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
9147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
9225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alamint Overlay::getPipeId(utils::eDest dest) {
9325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    return mPipeBook[(int)dest].mPipe->getPipeId();
9425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam}
9525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam
9625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib AlameDest Overlay::getDest(int pipeid) {
9725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    eDest dest = OV_INVALID;
9825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    // finding the dest corresponding to the given pipe
9925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    for(int i=0; i < PipeBook::NUM_PIPES; ++i) {
10025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam        if(mPipeBook[i].valid() && mPipeBook[i].mPipe->getPipeId() == pipeid) {
10125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam            return (eDest)i;
10225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam        }
10325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    }
10425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    return dest;
10525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam}
10625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam
10725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib AlameDest Overlay::reservePipe(int pipeid) {
10825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    eDest dest = getDest(pipeid);
10925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    PipeBook::setAllocation((int)dest);
11025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    return dest;
11125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam}
11225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam
1131a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh ShaheDest Overlay::nextPipe(eMdpPipeType type, int dpy, int mixer) {
11447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    eDest dest = OV_INVALID;
11547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
11647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
1171a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        if( (type == OV_MDP_PIPE_ANY || //Pipe type match
1181a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah             type == PipeBook::getPipeType((eDest)i)) &&
1191a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            (mPipeBook[i].mDisplay == DPY_UNUSED || //Free or same display
1201a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah             mPipeBook[i].mDisplay == dpy) &&
1211a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            (mPipeBook[i].mMixer == MIXER_UNUSED || //Free or same mixer
1221a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah             mPipeBook[i].mMixer == mixer) &&
1231a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            PipeBook::isNotAllocated(i) && //Free pipe
124531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal            ( (sDMAMultiplexingSupported && dpy) ||
125531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal              !(sDMAMode == DMA_BLOCK_MODE && //DMA pipe in Line mode
126531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal               PipeBook::getPipeType((eDest)i) == OV_MDP_PIPE_DMA)) ){
127531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal              //DMA-Multiplexing is only supported for WB on 8x26
1281a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            dest = (eDest)i;
1291a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            PipeBook::setAllocation(i);
1301a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            break;
131f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed        }
132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
13347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
13447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(dest != OV_INVALID) {
13547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        int index = (int)dest;
13647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        mPipeBook[index].mDisplay = dpy;
1371a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        mPipeBook[index].mMixer = mixer;
13847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        if(not mPipeBook[index].valid()) {
13947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            mPipeBook[index].mPipe = new GenericPipe(dpy);
14025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam            mPipeBook[index].mSession = PipeBook::NONE;
14147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            char str[32];
1421a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah            snprintf(str, 32, "Set=%s dpy=%d mix=%d; ",
1431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                     PipeBook::getDestStr(dest), dpy, mixer);
144d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG
145c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan            strlcat(mDumpStr, str, sizeof(mDumpStr));
146d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif
147f621867a9f77ca62c71b65cbdc3cf8d8877d2b32Naseer Ahmed        }
14847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    } else {
1491a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah        ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d mixer=%d",
1501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah                (int)type, dpy, mixer);
151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
15247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
15347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    return dest;
154befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
155ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
156314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe(const PipeSpecs& pipeSpecs) {
157314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    if(MDPVersion::getInstance().is8x26()) {
158314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        return getPipe_8x26(pipeSpecs);
159314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else if(MDPVersion::getInstance().is8x16()) {
160314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        return getPipe_8x16(pipeSpecs);
161314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    }
162314840035b55115a39d526cde009c678ccdacf40Saurabh Shah
163314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    eDest dest = OV_INVALID;
164314840035b55115a39d526cde009c678ccdacf40Saurabh Shah
165314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    //The default behavior is to assume RGB and VG pipes have scalars
166314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    if(pipeSpecs.formatClass == FORMAT_YUV) {
167314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
168314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else if(pipeSpecs.fb == false) { //RGB App layers
169314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(not pipeSpecs.needsScaling) {
170314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
171314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
172314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
173314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
174314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
175314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
176314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
177314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
178314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else { //FB layer
179314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
180314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
181314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
182314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
183314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //Some features can cause FB to have scaling as well.
184314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //If we ever come to this block with FB needing scaling,
185314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //the screen will be black for a frame, since the FB won't get a pipe
186314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //but atleast this will prevent a hang
187314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) {
188314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
189314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
190314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    }
191314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    return dest;
192314840035b55115a39d526cde009c678ccdacf40Saurabh Shah}
193314840035b55115a39d526cde009c678ccdacf40Saurabh Shah
194314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe_8x26(const PipeSpecs& pipeSpecs) {
195314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    //Use this to hide all the 8x26 requirements that cannot be humanly
196314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    //described in a generic way
197314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    eDest dest = OV_INVALID;
198314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    if(pipeSpecs.formatClass == FORMAT_YUV) { //video
199314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
200314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else if(pipeSpecs.fb == false) { //RGB app layers
201314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(not pipeSpecs.needsScaling) {
202314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
203314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
204314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
205314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
206314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
207314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
208314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
209314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
210314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else { //FB layer
211314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //For 8x26 Secondary we use DMA always for FB for inline rotation
212314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(pipeSpecs.dpy == DPY_PRIMARY) {
213314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
214314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            if(dest == OV_INVALID) {
215314840035b55115a39d526cde009c678ccdacf40Saurabh Shah                dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
216314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            }
217314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
218314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) {
219314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
220314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
221314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    }
222314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    return dest;
223314840035b55115a39d526cde009c678ccdacf40Saurabh Shah}
224314840035b55115a39d526cde009c678ccdacf40Saurabh Shah
225314840035b55115a39d526cde009c678ccdacf40Saurabh Shahutils::eDest Overlay::getPipe_8x16(const PipeSpecs& pipeSpecs) {
226314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    //Having such functions help keeping the interface generic but code specific
227314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    //and rife with assumptions
228314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    eDest dest = OV_INVALID;
229314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    if(pipeSpecs.formatClass == FORMAT_YUV or pipeSpecs.needsScaling) {
230314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
231314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else if(pipeSpecs.fb == false) { //RGB app layers
232314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //Since this is a specific func, we can assume stuff like RGB pipe not
233314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //having scalar blocks
234314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
235314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
236314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
237314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
238314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    } else {
239314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        //For 8x16 Secondary we use DMA always for FB for inline rotation
240314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(pipeSpecs.dpy == DPY_PRIMARY) {
241314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
242314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            if(dest == OV_INVALID) {
243314840035b55115a39d526cde009c678ccdacf40Saurabh Shah                dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
244314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            }
245314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
246314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        if(dest == OV_INVALID) {
247314840035b55115a39d526cde009c678ccdacf40Saurabh Shah            dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
248314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        }
249314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    }
250314840035b55115a39d526cde009c678ccdacf40Saurabh Shah    return dest;
251314840035b55115a39d526cde009c678ccdacf40Saurabh Shah}
252314840035b55115a39d526cde009c678ccdacf40Saurabh Shah
25325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alamvoid Overlay::endAllSessions() {
25425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
25525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam        if(mPipeBook[i].valid() && mPipeBook[i].mSession==PipeBook::START)
25625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam            mPipeBook[i].mSession = PipeBook::END;
25725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    }
25825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam}
25925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam
260586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shahbool Overlay::isPipeTypeAttached(eMdpPipeType type) {
261586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
262586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        if(type == PipeBook::getPipeType((eDest)i) &&
26376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah                mPipeBook[i].mDisplay != DPY_UNUSED) {
264586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah            return true;
265586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah        }
266586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    }
267586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah    return false;
268586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah}
269586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah
270348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shahint Overlay::comparePipePriority(utils::eDest pipe1Index,
271348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        utils::eDest pipe2Index) {
272348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    validate((int)pipe1Index);
273348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    validate((int)pipe2Index);
274348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    uint8_t pipe1Prio = mPipeBook[(int)pipe1Index].mPipe->getPriority();
275348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    uint8_t pipe2Prio = mPipeBook[(int)pipe2Index].mPipe->getPriority();
276348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    if(pipe1Prio > pipe2Prio)
277348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        return -1;
278159568fb06ec2eaa1846e3aef51de95d7586a8dfTatenda Chipeperekwa    if(pipe1Prio < pipe2Prio)
279159568fb06ec2eaa1846e3aef51de95d7586a8dfTatenda Chipeperekwa        return 1;
280348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    return 0;
281348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah}
282348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
28347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedbool Overlay::commit(utils::eDest dest) {
28447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    bool ret = false;
28547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
28647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
287ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
28847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(mPipeBook[index].mPipe->commit()) {
28947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ret = true;
29047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        PipeBook::setUse((int)dest);
29147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    } else {
29246731b93be48272c1d4e662a6af3c1d80365eb06Sushil Chauhan        int dpy = mPipeBook[index].mDisplay;
293b28b611dec8392c7c8f17bc5e71b0a656fa8daa8Saurabh Shah        for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
29420ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah            if (mPipeBook[i].mDisplay == dpy) {
29546731b93be48272c1d4e662a6af3c1d80365eb06Sushil Chauhan                PipeBook::resetAllocation(i);
29620ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah                PipeBook::resetUse(i);
29720ab3f49dbdb9482f456759cf2fed2264d1f01e2Saurabh Shah            }
298b28b611dec8392c7c8f17bc5e71b0a656fa8daa8Saurabh Shah        }
299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
30047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    return ret;
301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
302ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
30347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedbool Overlay::queueBuffer(int fd, uint32_t offset,
30447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        utils::eDest dest) {
30547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
30647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    bool ret = false;
30747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
30847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    //Queue only if commit() has succeeded (and the bit set)
30947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(PipeBook::isUsed((int)dest)) {
31047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ret = mPipeBook[index].mPipe->queueBuffer(fd, offset);
311befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
31247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    return ret;
313befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
314befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
31547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setCrop(const utils::Dim& d,
31647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        utils::eDest dest) {
31747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
31847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
31947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mPipeBook[index].mPipe->setCrop(d);
320befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
321befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
32208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanvoid Overlay::setColor(const uint32_t color,
32308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan        utils::eDest dest) {
32408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan    int index = (int)dest;
32508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan    validate(index);
32608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan    mPipeBook[index].mPipe->setColor(color);
32708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan}
32808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan
32947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setPosition(const utils::Dim& d,
33047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        utils::eDest dest) {
33147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
33247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
33347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mPipeBook[index].mPipe->setPosition(d);
334befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
33647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setTransform(const int orient,
33747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        utils::eDest dest) {
33847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
33947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
34047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
34147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    utils::eTransform transform =
34247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            static_cast<utils::eTransform>(orient);
34347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mPipeBook[index].mPipe->setTransform(transform);
34447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
345befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
346befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
34747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::setSource(const utils::PipeArgs args,
34847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        utils::eDest dest) {
34947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    int index = (int)dest;
35047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    validate(index);
351befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
35247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    PipeArgs newArgs(args);
3536e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_VG) {
35447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE);
35547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    } else {
35647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_SHARE);
35776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    }
358c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
3596e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    if(PipeBook::getPipeType(dest) == OV_MDP_PIPE_DMA) {
360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        setMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA);
361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    } else {
362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran        clearMdpFlags(newArgs.mdpFlags, OV_MDP_PIPE_FORCE_DMA);
363c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran    }
364c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran
36547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mPipeBook[index].mPipe->setSource(newArgs);
36647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
36747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
3685d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahvoid Overlay::setVisualParams(const MetaData_t& metadata, utils::eDest dest) {
3695d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    int index = (int)dest;
3705d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    validate(index);
3715d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mPipeBook[index].mPipe->setVisualParams(metadata);
3725d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah}
3735d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
37447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay* Overlay::getInstance() {
37547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(sInstance == NULL) {
37647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        sInstance = new Overlay();
37747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    }
37847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    return sInstance;
37976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah}
38076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
3816e146950e61327d425750c1de36bfd70d526acadSushil Chauhan// Clears any VG pipes allocated to the fb devices
3826e146950e61327d425750c1de36bfd70d526acadSushil Chauhan// Generates a LUT for pipe types.
3836e146950e61327d425750c1de36bfd70d526acadSushil Chauhanint Overlay::initOverlay() {
3846e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion();
3856e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    int numPipesXType[OV_MDP_PIPE_ANY] = {0};
3866e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    numPipesXType[OV_MDP_PIPE_RGB] =
3876e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            qdutils::MDPVersion::getInstance().getRGBPipes();
3886e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    numPipesXType[OV_MDP_PIPE_VG] =
3896e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            qdutils::MDPVersion::getInstance().getVGPipes();
3906e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    numPipesXType[OV_MDP_PIPE_DMA] =
3916e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            qdutils::MDPVersion::getInstance().getDMAPipes();
3926e146950e61327d425750c1de36bfd70d526acadSushil Chauhan
3936e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    int index = 0;
3946e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    for(int X = 0; X < (int)OV_MDP_PIPE_ANY; X++) { //iterate over types
3956e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        for(int j = 0; j < numPipesXType[X]; j++) { //iterate over num
3966e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            PipeBook::pipeTypeLUT[index] = (utils::eMdpPipeType)X;
3976e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            index++;
3986e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        }
3996e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    }
4006e146950e61327d425750c1de36bfd70d526acadSushil Chauhan
401a4ab187a1b29575833190181c3a653a4b9ab76deXiaoming Zhou    if (mdpVersion < qdutils::MDSS_V5 && mdpVersion != qdutils::MDP_V3_0_4) {
4026e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        msmfb_mixer_info_req  req;
4036e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        mdp_mixer_info *minfo = NULL;
4046e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        char name[64];
4056e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        int fd = -1;
40676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        for(int i = 0; i < MAX_FB_DEVICES; i++) {
4076e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            snprintf(name, 64, FB_DEVICE_TEMPLATE, i);
4086e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            ALOGD("initoverlay:: opening the device:: %s", name);
4096e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            fd = ::open(name, O_RDWR, 0);
4106e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            if(fd < 0) {
4116e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                ALOGE("cannot open framebuffer(%d)", i);
4126e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                return -1;
4136e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            }
4146e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            //Get the mixer configuration */
4156e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            req.mixer_num = i;
4166e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            if (ioctl(fd, MSMFB_MIXER_INFO, &req) == -1) {
4176e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                ALOGE("ERROR: MSMFB_MIXER_INFO ioctl failed");
4186e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                close(fd);
4196e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                return -1;
4206e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            }
4216e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            minfo = req.info;
4226e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            for (int j = 0; j < req.cnt; j++) {
4236e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                ALOGD("ndx=%d num=%d z_order=%d", minfo->pndx, minfo->pnum,
4246e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                      minfo->z_order);
4256e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                // except the RGB base layer with z_order of -1, clear any
4266e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                // other pipes connected to mixer.
4276e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                if((minfo->z_order) != -1) {
4286e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                    int index = minfo->pndx;
4296e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                    ALOGD("Unset overlay with index: %d at mixer %d", index, i);
4306e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                    if(ioctl(fd, MSMFB_OVERLAY_UNSET, &index) == -1) {
4316e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                        ALOGE("ERROR: MSMFB_OVERLAY_UNSET failed");
4326e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                        close(fd);
4336e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                        return -1;
4346e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                    }
4356e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                }
4366e146950e61327d425750c1de36bfd70d526acadSushil Chauhan                minfo++;
4376e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            }
4386e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            close(fd);
4396e146950e61327d425750c1de36bfd70d526acadSushil Chauhan            fd = -1;
4406e146950e61327d425750c1de36bfd70d526acadSushil Chauhan        }
44147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    }
44276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
44376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    FILE *displayDeviceFP = NULL;
44476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    const int MAX_FRAME_BUFFER_NAME_SIZE = 128;
44576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    char fbType[MAX_FRAME_BUFFER_NAME_SIZE];
44676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE];
44776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    const char *strDtvPanel = "dtv panel";
44876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    const char *strWbPanel = "writeback panel";
44976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
45076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    for(int num = 1; num < MAX_FB_DEVICES; num++) {
45176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        snprintf (msmFbTypePath, sizeof(msmFbTypePath),
45276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah                "/sys/class/graphics/fb%d/msm_fb_type", num);
45376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        displayDeviceFP = fopen(msmFbTypePath, "r");
45476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
45576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        if(displayDeviceFP){
45676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah            fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE,
45776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah                    displayDeviceFP);
45876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
45976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah            if(strncmp(fbType, strDtvPanel, strlen(strDtvPanel)) == 0) {
46076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah                sDpyFbMap[DPY_EXTERNAL] = num;
46176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah            } else if(strncmp(fbType, strWbPanel, strlen(strWbPanel)) == 0) {
46276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah                sDpyFbMap[DPY_WRITEBACK] = num;
46376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah            }
46476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
46576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah            fclose(displayDeviceFP);
46676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah        }
46776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    }
46876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
4696e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    return 0;
47047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
47147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
47276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahbool Overlay::displayCommit(const int& fd) {
473c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    utils::Dim lRoi, rRoi;
474c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    return displayCommit(fd, lRoi, rRoi);
475bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran}
476bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
477c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool Overlay::displayCommit(const int& fd, const utils::Dim& lRoi,
478c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran        const utils::Dim& rRoi) {
47976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    //Commit
48076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    struct mdp_display_commit info;
48176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    memset(&info, 0, sizeof(struct mdp_display_commit));
48276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    info.flags = MDP_DISPLAY_COMMIT_OVERLAY;
483c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.l_roi.x = lRoi.x;
484c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.l_roi.y = lRoi.y;
485c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.l_roi.w = lRoi.w;
486c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.l_roi.h = lRoi.h;
487c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.r_roi.x = rRoi.x;
488c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.r_roi.y = rRoi.y;
489c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.r_roi.w = rRoi.w;
490c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran    info.r_roi.h = rRoi.h;
491bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran
49276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    if(!mdp_wrapper::displayCommit(fd, info)) {
493bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        ALOGE("%s: commit failed", __func__);
494bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran        return false;
49576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    }
49676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah    return true;
49776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah}
49876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah
49947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::dump() const {
500d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#if PIPE_DEBUG
50147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(strlen(mDumpStr)) { //dump only on state change
502d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah        ALOGD("%s\n", mDumpStr);
50347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    }
504d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah#endif
50547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
50647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
507a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid Overlay::getDump(char *buf, size_t len) {
508a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    int totalPipes = 0;
5094762db4eb027284225be9d10f08d87252612064cSaurabh Shah    const char *str = "\nOverlay State\n\n";
510c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan    strlcat(buf, str, len);
511a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
512a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah        if(mPipeBook[i].valid()) {
513a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah            mPipeBook[i].mPipe->getDump(buf, len);
514a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah            char str[64] = {'\0'};
5154762db4eb027284225be9d10f08d87252612064cSaurabh Shah            snprintf(str, 64, "Display=%d\n\n", mPipeBook[i].mDisplay);
516c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan            strlcat(buf, str, len);
517a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah            totalPipes++;
518a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah        }
519a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    }
520a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah    char str_pipes[64] = {'\0'};
5214762db4eb027284225be9d10f08d87252612064cSaurabh Shah    snprintf(str_pipes, 64, "Pipes=%d\n\n", totalPipes);
522c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan    strlcat(buf, str_pipes, len);
523a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah}
524a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah
5256c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhanvoid Overlay::clear(int dpy) {
5266c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
5276c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan        if (mPipeBook[i].mDisplay == dpy) {
5286c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan            // Mark as available for this round
5296c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan            PipeBook::resetUse(i);
5306c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan            PipeBook::resetAllocation(i);
5316c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan        }
5326c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan    }
5336c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan}
5346c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan
5351029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool Overlay::validateAndSet(const int& dpy, const int& fbFd) {
5361029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    GenericPipe* pipeArray[PipeBook::NUM_PIPES];
5371029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    memset(&pipeArray, 0, sizeof(pipeArray));
5381029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
5391029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    int num = 0;
5401029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
5411029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        if(PipeBook::isUsed(i) && mPipeBook[i].valid() &&
5421029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah                mPipeBook[i].mDisplay == dpy) {
5431029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah            pipeArray[num++] = mPipeBook[i].mPipe;
5441029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        }
5451029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    }
5461029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
5471029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    //Protect against misbehaving clients
5481029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    return num ? GenericPipe::validateAndSet(pipeArray, num, fbFd) : true;
5491029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah}
5501029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
551072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid Overlay::initScalar() {
552072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    if(sLibScaleHandle == NULL) {
553072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        sLibScaleHandle = dlopen("libscale.so", RTLD_NOW);
554bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah        if(sLibScaleHandle) {
555bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah            *(void **) &sFnProgramScale =
556bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah                    dlsym(sLibScaleHandle, "programScale");
557072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        }
558072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    }
559072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah}
560072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
561072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid Overlay::destroyScalar() {
562072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    if(sLibScaleHandle) {
563072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        dlclose(sLibScaleHandle);
564072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        sLibScaleHandle = NULL;
565072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    }
566072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah}
567072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
56847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::PipeBook::init() {
56947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mPipe = NULL;
57047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mDisplay = DPY_UNUSED;
5711a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    mMixer = MIXER_UNUSED;
57247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}
57347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
57447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedvoid Overlay::PipeBook::destroy() {
57547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if(mPipe) {
57647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        delete mPipe;
57747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        mPipe = NULL;
57899052c13b84efd00bfc1083e454d660a31cbf38aAjay Dudani    }
57947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    mDisplay = DPY_UNUSED;
5801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah    mMixer = MIXER_UNUSED;
58125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam    mSession = NONE;
582befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
583befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
58447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer AhmedOverlay* Overlay::sInstance = 0;
58576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahint Overlay::sDpyFbMap[DPY_MAX] = {0, -1, -1};
58611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahint Overlay::sDMAMode = DMA_LINE_MODE;
587531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamalbool Overlay::sDMAMultiplexingSupported = false;
58847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::NUM_PIPES = 0;
58947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sPipeUsageBitmap = 0;
59047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sLastUsageBitmap = 0;
59147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedint Overlay::PipeBook::sAllocatedBitmap = 0;
5926e146950e61327d425750c1de36bfd70d526acadSushil Chauhanutils::eMdpPipeType Overlay::PipeBook::pipeTypeLUT[utils::OV_MAX] =
5936e146950e61327d425750c1de36bfd70d526acadSushil Chauhan    {utils::OV_MDP_PIPE_ANY};
594072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shahvoid *Overlay::sLibScaleHandle = NULL;
595bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shahint (*Overlay::sFnProgramScale)(struct mdp_overlay_list *) = NULL;
59647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
59747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}; // namespace overlay
598