1/*
2 * Copyright@ Samsung Electronics Co. LTD
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15*/
16
17/*!
18 * \file      ExynosBuffer.h
19 * \brief     header file for ExynosBuffer
20 * \author    Sangwoo, Park(sw5771.park@samsung.com)
21 * \date      2011/06/02
22 *
23 * <b>Revision History: </b>
24 * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com) \n
25 *   Initial version
26 *
27 * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
28 *   Change file, struct name to ExynosXXX.
29 *
30 */
31
32#ifndef EXYNOS_BUFFER_H_
33#define EXYNOS_BUFFER_H_
34
35#include <sys/types.h>
36
37//! Buffer information
38/*!
39 * \ingroup Exynos
40 */
41struct ExynosBuffer
42{
43public:
44    //! Buffer type
45    enum BUFFER_TYPE
46    {
47        BUFFER_TYPE_BASE     = 0,
48        BUFFER_TYPE_VIRT     = 1,      //!< virtual address
49        BUFFER_TYPE_PHYS     = 1 << 1, //!< physical address
50        BUFFER_TYPE_RESERVED = 1 << 2, //!< reserved type
51        BUFFER_TYPE_FD       = 1 << 3, //!< physical address
52        BUFFER_TYPE_MAX,
53    };
54
55    //! Buffer virtual address
56    union {
57        char *p;       //! single address.
58        char *extP[3]; //! Y Cb Cr.
59    } virt;
60
61    //! Buffer physical address
62    union {
63        unsigned int p;       //! single address.
64        unsigned int extP[3]; //! Y Cb Cr.
65    } phys;
66
67    //! Buffer file descriptors
68    union {
69	int fd;
70	int extFd[3];
71    } fd;
72
73    //! Buffer reserved id
74    union {
75        unsigned int p;       //! \n
76        unsigned int extP[3]; //! \n
77    } reserved;
78
79    //! Buffer size
80    union {
81        unsigned int s;
82        unsigned int extS[3];
83    } size;
84
85#ifdef __cplusplus
86    //! Constructor
87    ExynosBuffer()
88    {
89        for (int i = 0; i < 3; i++) {
90            virt.    extP[i] = NULL;
91            phys.    extP[i] = 0;
92	    fd.      extFd[i] = -1;
93            reserved.extP[i] = 0;
94            size.    extS[i] = 0;
95        }
96    }
97
98    //! Constructor
99    ExynosBuffer(const ExynosBuffer *other)
100    {
101        for (int i = 0; i < 3; i++) {
102            virt.    extP[i] = other->virt.extP[i];
103            phys.    extP[i] = other->phys.extP[i];
104	    fd.      extFd[i] = other->fd.extFd[i];
105            reserved.extP[i] = other->reserved.extP[i];
106            size.    extS[i] = other->size.extS[i];
107        }
108    }
109
110    //! Operator(=) override
111    ExynosBuffer& operator =(const ExynosBuffer &other)
112    {
113        for (int i = 0; i < 3; i++) {
114            virt.    extP[i] = other.virt.extP[i];
115            phys.    extP[i] = other.phys.extP[i];
116	    fd.      extFd[i] = other.fd.extFd[i];
117            reserved.extP[i] = other.reserved.extP[i];
118            size.    extS[i] = other.size.extS[i];
119        }
120        return *this;
121    }
122
123    //! Operator(==) override
124    bool operator ==(const ExynosBuffer &other) const
125    {
126        return (   virt.    extP[0] == other.virt.extP[0]
127                && virt.    extP[1] == other.virt.extP[1]
128                && virt.    extP[2] == other.virt.extP[2]
129                && phys.    extP[0] == other.phys.extP[0]
130                && phys.    extP[1] == other.phys.extP[1]
131                && phys.    extP[2] == other.phys.extP[2]
132                && fd.      extFd[0] == other.fd.extFd[0]
133                && fd.      extFd[1] == other.fd.extFd[1]
134                && fd.      extFd[2] == other.fd.extFd[2]
135                && reserved.extP[0] == other.reserved.extP[0]
136                && reserved.extP[1] == other.reserved.extP[1]
137                && reserved.extP[2] == other.reserved.extP[2]
138                && size.    extS[0] == other.size.extS[0]
139                && size.    extS[1] == other.size.extS[1]
140                && size.    extS[2] == other.size.extS[2]);
141    }
142
143    //! Operator(!=) override
144    bool operator !=(const ExynosBuffer &other) const
145    {
146        // use operator(==)
147        return !(*this == other);
148    }
149
150    //! Get Buffer type
151    static int BUFFER_TYPE(ExynosBuffer *buf)
152    {
153        int type = BUFFER_TYPE_BASE;
154        if (buf->virt.p)
155            type |= BUFFER_TYPE_VIRT;
156        if (buf->phys.p)
157            type |= BUFFER_TYPE_PHYS;
158	if (buf->fd.fd >= 0)
159            type |= BUFFER_TYPE_FD;
160        if (buf->reserved.p)
161            type |= BUFFER_TYPE_RESERVED;
162
163        return type;
164    }
165#endif
166};
167
168#endif //EXYNOS_BUFFER_H_
169