1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 25d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah* 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 30befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#ifndef OVERLAY_H 31befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define OVERLAY_H 32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayUtils.h" 34531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal#include "mdp_version.h" 35620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#include "utils/threads.h" 36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 375d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahstruct MetaData_t; 385d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah 39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay { 4047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedclass GenericPipe; 4147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedclass Overlay : utils::NoCopy { 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedpublic: 4411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah enum { DMA_BLOCK_MODE, DMA_LINE_MODE }; 4576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //Abstract Display types. Each backed by a LayerMixer, 4676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //represented by a fb node. 4776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah //High res panels can be backed by 2 layer mixers and a single fb node. 4876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah enum { DPY_PRIMARY, DPY_EXTERNAL, DPY_WRITEBACK, DPY_UNUSED }; 4976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah enum { DPY_MAX = DPY_UNUSED }; 501a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah enum { MIXER_LEFT, MIXER_RIGHT, MIXER_UNUSED }; 511a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah enum { MIXER_DEFAULT = MIXER_LEFT, MIXER_MAX = MIXER_UNUSED }; 5276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah enum { MAX_FB_DEVICES = DPY_MAX }; 53314840035b55115a39d526cde009c678ccdacf40Saurabh Shah enum { FORMAT_YUV, FORMAT_RGB }; 54314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 55314840035b55115a39d526cde009c678ccdacf40Saurabh Shah struct PipeSpecs { 56314840035b55115a39d526cde009c678ccdacf40Saurabh Shah PipeSpecs() : formatClass(FORMAT_RGB), needsScaling(false), fb(false), 57314840035b55115a39d526cde009c678ccdacf40Saurabh Shah dpy(DPY_PRIMARY), mixer(MIXER_DEFAULT) {} 58314840035b55115a39d526cde009c678ccdacf40Saurabh Shah int formatClass; 59314840035b55115a39d526cde009c678ccdacf40Saurabh Shah bool needsScaling; 60314840035b55115a39d526cde009c678ccdacf40Saurabh Shah bool fb; 61314840035b55115a39d526cde009c678ccdacf40Saurabh Shah int dpy; 62314840035b55115a39d526cde009c678ccdacf40Saurabh Shah int mixer; 63314840035b55115a39d526cde009c678ccdacf40Saurabh Shah }; 6411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed /* dtor close */ 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ~Overlay(); 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 6847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Marks the beginning of a drawing round, resets usage bits on pipes 6947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Should be called when drawing begins before any pipe config is done. 7047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed */ 7147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void configBegin(); 7247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 7347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Marks the end of config for this drawing round 7447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Will do garbage collection of pipe objects and thus calling UNSETs, 7547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * closing FDs, removing rotator objects and memory, if allocated. 7647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed * Should be called after all pipe configs are done. 7747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed */ 7847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void configDone(); 7947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 80314840035b55115a39d526cde009c678ccdacf40Saurabh Shah /* Get a pipe that supported the specified format class (yuv, rgb) and has 81314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * scaling capabilities. 82314840035b55115a39d526cde009c678ccdacf40Saurabh Shah */ 83314840035b55115a39d526cde009c678ccdacf40Saurabh Shah utils::eDest getPipe(const PipeSpecs& pipeSpecs); 8425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* Returns the eDest corresponding to an already allocated pipeid. 8525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam * Useful for the reservation case, when libvpu reserves the pipe at its 8625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam * end, and expect the overlay to allocate a given pipe for a layer. 8725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam */ 8825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam utils::eDest reservePipe(int pipeid); 8925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* getting dest for the given pipeid */ 9025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam utils::eDest getDest(int pipeid); 9125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* getting overlay.pipeid for the given dest */ 9225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam int getPipeId(utils::eDest dest); 9347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 9447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void setSource(const utils::PipeArgs args, utils::eDest dest); 9547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void setCrop(const utils::Dim& d, utils::eDest dest); 9608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan void setColor(const uint32_t color, utils::eDest dest); 9747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void setTransform(const int orientation, utils::eDest dest); 9847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void setPosition(const utils::Dim& dim, utils::eDest dest); 995d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah void setVisualParams(const MetaData_t& data, utils::eDest dest); 10047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool commit(utils::eDest dest); 10147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool queueBuffer(int fd, uint32_t offset, utils::eDest dest); 10247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 10325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* pipe reservation session is running */ 10425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam bool sessionInProgress(utils::eDest dest); 10525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* pipe reservation session has ended*/ 10625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam bool isSessionEnded(utils::eDest dest); 10725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* start session for the pipe reservation */ 10825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam void startSession(utils::eDest dest); 10925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* end all started sesisons */ 11025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam void endAllSessions(); 1111a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah /* Returns available ("unallocated") pipes for a display's mixer */ 1121a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int availablePipes(int dpy, int mixer); 11301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah /* Returns available ("unallocated") pipes for a display */ 11401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int availablePipes(int dpy); 11511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah /* Returns available ("unallocated") pipe of given type for a display */ 11611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int availablePipes(int dpy, utils::eMdpPipeType type); 117586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah /* Returns if any of the requested pipe type is attached to any of the 118586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah * displays 119586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah */ 120586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah bool isPipeTypeAttached(utils::eMdpPipeType type); 121348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah /* Compare pipe priorities and return 122348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah * 1 if 1st pipe has a higher priority 123348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah * 0 if both have the same priority 124348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah *-1 if 2nd pipe has a higher priority 125348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah */ 126348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah int comparePipePriority(utils::eDest pipe1Index, utils::eDest pipe2Index); 127a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah /* Returns pipe dump. Expects a NULL terminated buffer of big enough size 128a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah * to populate. 129a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah */ 130a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah void getDump(char *buf, size_t len); 1316c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan /* Reset usage and allocation bits on all pipes for given display */ 1326c00d487ca26b6ad864256248b0c5c59034d120eSushil Chauhan void clear(int dpy); 1331029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah /* Validate the set of pipes for a display and set them in driver */ 1341029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah bool validateAndSet(const int& dpy, const int& fbFd); 135eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah 136eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah /* Closes open pipes, called during startup */ 137eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah static int initOverlay(); 138eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah /* Returns the singleton instance of overlay */ 139eab2696fe84189de2eecbd9187fa7fa037310975Saurabh Shah static Overlay* getInstance(); 14011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah static void setDMAMode(const int& mode); 14111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah static int getDMAMode(); 14276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah /* Returns the framebuffer node backing up the display */ 14376a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah static int getFbForDpy(const int& dpy); 144c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 14576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah static bool displayCommit(const int& fd); 146c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran /* Overloads display commit with ROI's of each halves. 147c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran * Single interface panels will only update left ROI. */ 148c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran static bool displayCommit(const int& fd, const utils::Dim& lRoi, 149c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran const utils::Dim& rRoi); 150befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedprivate: 152befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed /* Ctor setup */ 15347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed explicit Overlay(); 15447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /*Validate index range, abort if invalid */ 15547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void validate(int index); 156531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal static void setDMAMultiplexingSupported(); 15747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void dump() const; 158314840035b55115a39d526cde009c678ccdacf40Saurabh Shah /* Returns an available pipe based on the type of pipe requested. When ANY 159314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * is requested, the first available VG or RGB is returned. If no pipe is 160314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * available for the display "dpy" then INV is returned. Note: If a pipe is 161314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * assigned to a certain display, then it cannot be assigned to another 162314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * display without being garbage-collected once. To add if a pipe is 163314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * asisgned to a mixer within a display it cannot be reused for another 164314840035b55115a39d526cde009c678ccdacf40Saurabh Shah * mixer without being UNSET once*/ 165314840035b55115a39d526cde009c678ccdacf40Saurabh Shah utils::eDest nextPipe(utils::eMdpPipeType, int dpy, int mixer); 166314840035b55115a39d526cde009c678ccdacf40Saurabh Shah /* Helpers that enfore target specific policies while returning pipes */ 167314840035b55115a39d526cde009c678ccdacf40Saurabh Shah utils::eDest getPipe_8x26(const PipeSpecs& pipeSpecs); 168314840035b55115a39d526cde009c678ccdacf40Saurabh Shah utils::eDest getPipe_8x16(const PipeSpecs& pipeSpecs); 169314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 170bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah /* Returns the handle to libscale.so's programScale function */ 171bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah static int (*getFnProgramScale())(struct mdp_overlay_list *); 172072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah /* Creates a scalar object using libscale.so */ 173072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah static void initScalar(); 174072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah /* Destroys the scalar object using libscale.so */ 175072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah static void destroyScalar(); 176befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 17747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Just like a Facebook for pipes, but much less profile info */ 17847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed struct PipeBook { 17947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void init(); 18047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed void destroy(); 18147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Check if pipe exists and return true, false otherwise */ 18247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool valid(); 18347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 18447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Hardware pipe wrapper */ 18547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed GenericPipe *mPipe; 18647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Display using this pipe. Refer to enums above */ 18747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed int mDisplay; 1881a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah /* Mixer within a split display this pipe is attached to */ 1891a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int mMixer; 19047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 19147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* operations on bitmap */ 19247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static bool pipeUsageUnchanged(); 19347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static void setUse(int index); 19447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static void resetUse(int index); 19547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static bool isUsed(int index); 19647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static bool isNotUsed(int index); 19747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static void save(); 19847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 19947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static void setAllocation(int index); 20047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static void resetAllocation(int index); 20147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static bool isAllocated(int index); 20247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static bool isNotAllocated(int index); 20347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 2046e146950e61327d425750c1de36bfd70d526acadSushil Chauhan static utils::eMdpPipeType getPipeType(utils::eDest dest); 2056e146950e61327d425750c1de36bfd70d526acadSushil Chauhan static const char* getDestStr(utils::eDest dest); 2066e146950e61327d425750c1de36bfd70d526acadSushil Chauhan 20747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static int NUM_PIPES; 2086e146950e61327d425750c1de36bfd70d526acadSushil Chauhan static utils::eMdpPipeType pipeTypeLUT[utils::OV_MAX]; 20925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam /* Session for reserved pipes */ 21025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam enum Session { 21125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam NONE, 21225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam START, 21325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam END 21425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam }; 21525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam Session mSession; 21647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 21747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed private: 21847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //usage tracks if a successful commit happened. So a pipe could be 21947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //allocated to a display, but it may not end up using it for various 22047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //reasons. If one display actually uses a pipe then it amy not be 22147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //used by another display, without an UNSET in between. 22247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static int sPipeUsageBitmap; 22347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static int sLastUsageBitmap; 22447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //Tracks which pipe objects are allocated. This does not imply that they 22547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //will actually be used. For example, a display might choose to acquire 22647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //3 pipe objects in one shot and proceed with config only if it gets all 22747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed //3. The bitmap helps allocate different pipe objects on each request. 22847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static int sAllocatedBitmap; 22947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed }; 23047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 23147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed PipeBook mPipeBook[utils::OV_INVALID]; //Used as max 23247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 23347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Dump string */ 234d6749ede0923b1660dbc45b9c0c93e48c83916ceSaurabh Shah char mDumpStr[1024]; 23547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 23647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed /* Singleton Instance*/ 23747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static Overlay *sInstance; 23876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah static int sDpyFbMap[DPY_MAX]; 23911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah static int sDMAMode; 240531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal static bool sDMAMultiplexingSupported; 241072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah static void *sLibScaleHandle; 242bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah static int (*sFnProgramScale)(struct mdp_overlay_list *); 2431029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 2441029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah friend class MdpCtrl; 245befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 246befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 24747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::validate(int index) { 24847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed OVASSERT(index >=0 && index < PipeBook::NUM_PIPES, \ 24947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed "%s, Index out of bounds: %d", __FUNCTION__, index); 25047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed OVASSERT(mPipeBook[index].valid(), "Pipe does not exist %s", 2516e146950e61327d425750c1de36bfd70d526acadSushil Chauhan PipeBook::getDestStr((utils::eDest)index)); 25247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 25347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 2541a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahinline int Overlay::availablePipes(int dpy, int mixer) { 2551a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah int avail = 0; 2561a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 2571a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if( (mPipeBook[i].mDisplay == DPY_UNUSED || 2581a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[i].mDisplay == dpy) && 2591a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah (mPipeBook[i].mMixer == MIXER_UNUSED || 2601a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah mPipeBook[i].mMixer == mixer) && 2611a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::isNotAllocated(i) && 2621a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah !(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE && 2631a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah PipeBook::getPipeType((utils::eDest)i) == 26401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah utils::OV_MDP_PIPE_DMA)) { 26501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah avail++; 26601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 26701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah } 26801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah return avail; 26901dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah} 27001dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah 27101dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shahinline int Overlay::availablePipes(int dpy) { 27201dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah int avail = 0; 27301dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 27401dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah if( (mPipeBook[i].mDisplay == DPY_UNUSED || 27501dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah mPipeBook[i].mDisplay == dpy) && 27601dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah PipeBook::isNotAllocated(i) && 27701dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah !(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE && 27801dd672ad5214ebaf753b84a054bc26b7f9b5bafSaurabh Shah PipeBook::getPipeType((utils::eDest)i) == 2791a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah utils::OV_MDP_PIPE_DMA)) { 2801a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah avail++; 281c500638565ae6b65a7007c5d1ad73f1ec5c7e53cJeykumar Sankaran } 282c500638565ae6b65a7007c5d1ad73f1ec5c7e53cJeykumar Sankaran } 283c500638565ae6b65a7007c5d1ad73f1ec5c7e53cJeykumar Sankaran return avail; 28447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 28547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 28611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shahinline int Overlay::availablePipes(int dpy, utils::eMdpPipeType type) { 28711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah int avail = 0; 28811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah for(int i = 0; i < PipeBook::NUM_PIPES; i++) { 28911bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah if((mPipeBook[i].mDisplay == DPY_UNUSED || 29011bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah mPipeBook[i].mDisplay == dpy) && 29111bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah PipeBook::isNotAllocated(i) && 29211bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah type == PipeBook::getPipeType((utils::eDest)i)) { 29311bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah avail++; 29411bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 29511bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah } 29611bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah return avail; 29711bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah} 29811bf9c368a2ff832b1a20d9c90ec796e3d29bf9fSaurabh Shah 29911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahinline void Overlay::setDMAMode(const int& mode) { 30011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(mode == DMA_LINE_MODE || mode == DMA_BLOCK_MODE) 30111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sDMAMode = mode; 30211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah} 30311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 304531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamalinline void Overlay::setDMAMultiplexingSupported() { 305531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal sDMAMultiplexingSupported = false; 306531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal if(qdutils::MDPVersion::getInstance().is8x26()) 307531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal sDMAMultiplexingSupported = true; 308531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal} 309531ab83263f2678b1b406b65a0415655ef5e73b7Raj Kamal 31011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahinline int Overlay::getDMAMode() { 31111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah return sDMAMode; 31211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah} 31311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 31476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shahinline int Overlay::getFbForDpy(const int& dpy) { 31576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah OVASSERT(dpy >= 0 && dpy < DPY_MAX, "Invalid dpy %d", dpy); 31676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah return sDpyFbMap[dpy]; 31776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah} 31876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 319bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shahinline int (*Overlay::getFnProgramScale())(struct mdp_overlay_list *) { 320bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah return sFnProgramScale; 321072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah} 322072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah 32347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::valid() { 32447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return (mPipe != NULL); 32547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 32647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 32747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::pipeUsageUnchanged() { 32847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return (sPipeUsageBitmap == sLastUsageBitmap); 32947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 33047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 33147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::PipeBook::setUse(int index) { 33247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sPipeUsageBitmap |= (1 << index); 33347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 33447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 33547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::PipeBook::resetUse(int index) { 33647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sPipeUsageBitmap &= ~(1 << index); 33747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 33847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 33947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::isUsed(int index) { 34047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return sPipeUsageBitmap & (1 << index); 34147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 34247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 34347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::isNotUsed(int index) { 34447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return !isUsed(index); 34547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 34647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 34747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::PipeBook::save() { 34847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sLastUsageBitmap = sPipeUsageBitmap; 34947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 35047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 35147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::PipeBook::setAllocation(int index) { 35247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sAllocatedBitmap |= (1 << index); 35347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 35447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 35547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline void Overlay::PipeBook::resetAllocation(int index) { 35647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed sAllocatedBitmap &= ~(1 << index); 35747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 35847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 35947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::isAllocated(int index) { 36047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return sAllocatedBitmap & (1 << index); 36147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 36247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 36347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedinline bool Overlay::PipeBook::isNotAllocated(int index) { 36447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return !isAllocated(index); 36547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed} 36647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 3676e146950e61327d425750c1de36bfd70d526acadSushil Chauhaninline utils::eMdpPipeType Overlay::PipeBook::getPipeType(utils::eDest dest) { 3686e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return pipeTypeLUT[(int)dest]; 3696e146950e61327d425750c1de36bfd70d526acadSushil Chauhan} 3706e146950e61327d425750c1de36bfd70d526acadSushil Chauhan 37125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alaminline void Overlay::startSession(utils::eDest dest) { 37225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam mPipeBook[(int)dest].mSession = PipeBook::START; 37325a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 37425a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 37525a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alaminline bool Overlay::sessionInProgress(utils::eDest dest) { 37625a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return (mPipeBook[(int)dest].mSession == PipeBook::START); 37725a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 37825a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 37925a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alaminline bool Overlay::isSessionEnded(utils::eDest dest) { 38025a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam return (mPipeBook[(int)dest].mSession == PipeBook::END); 38125a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam} 38225a5fbfe77bcdba08934b0cb3081b6cf8021ba46Zohaib Alam 3836e146950e61327d425750c1de36bfd70d526acadSushil Chauhaninline const char* Overlay::PipeBook::getDestStr(utils::eDest dest) { 3846e146950e61327d425750c1de36bfd70d526acadSushil Chauhan switch(getPipeType(dest)) { 3856e146950e61327d425750c1de36bfd70d526acadSushil Chauhan case utils::OV_MDP_PIPE_RGB: return "RGB"; 3866e146950e61327d425750c1de36bfd70d526acadSushil Chauhan case utils::OV_MDP_PIPE_VG: return "VG"; 3876e146950e61327d425750c1de36bfd70d526acadSushil Chauhan case utils::OV_MDP_PIPE_DMA: return "DMA"; 3886e146950e61327d425750c1de36bfd70d526acadSushil Chauhan default: return "Invalid"; 3896e146950e61327d425750c1de36bfd70d526acadSushil Chauhan } 3906e146950e61327d425750c1de36bfd70d526acadSushil Chauhan return "Invalid"; 3916e146950e61327d425750c1de36bfd70d526acadSushil Chauhan} 3926e146950e61327d425750c1de36bfd70d526acadSushil Chauhan 39347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed}; // overlay 394befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 395befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif // OVERLAY_H 396