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