Imported Upstream version 0.3.0
[ubuntu-omap:rsalvetis-xf86-video-omap.git] / src / omap_driver.h
1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
2
3 /*
4  * Copyright © 2011 Texas Instruments, Inc
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the next
14  * paragraph) shall be included in all copies or substantial portions of the
15  * Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  *
25  * Authors:
26  *    Ian Elliott <ianelliottus@yahoo.com>
27  *    Rob Clark <rob@ti.com>
28  */
29
30 #ifndef __OMAP_DRV_H__
31 #define __OMAP_DRV_H__
32
33 /* All drivers need the following headers: */
34 #include "xf86.h"
35 #include "xf86_OSproc.h"
36
37 /* XXX - Perhaps, the following header files will only be used temporarily
38  * (i.e. so we can use fbdevHW, SW cursor, etc):
39  * XXX - figure out what can be removed..
40  */
41 #include "mipointer.h"
42 #include "mibstore.h"
43 #include "micmap.h"
44 #include "colormapst.h"
45 #include "xf86cmap.h"
46 #include "shadow.h"
47 /* for visuals */
48 #include "fb.h"
49 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
50 #include "xf86Resources.h"
51 #include "xf86RAC.h"
52 #endif
53 #include "xf86xv.h"
54 #include "xf86Crtc.h"
55 #include "xf86RandR12.h"
56 #include "xf86drm.h"
57 #include "drm_fourcc.h"
58 #include "dri2.h"
59
60 #include <omap_drm.h>
61 #include <omap_drmif.h>
62
63 #include <errno.h>
64
65 #include "omap_exa.h"
66
67
68 #define OMAP_VERSION            1000    /* Apparently not used by X server */
69 #define OMAP_NAME                       "OMAP"  /* Name used to prefix messages */
70 #define OMAP_DRIVER_NAME        "omap"  /* Driver name as used in config file */
71 #define OMAP_MAJOR_VERSION      0
72 #define OMAP_MINOR_VERSION      83
73 #define OMAP_PATCHLEVEL         0
74
75 /**
76  * This controls whether debug statements (and function "trace" enter/exit)
77  * messages are sent to the log file (TRUE) or are ignored (FALSE).
78  */
79 extern _X_EXPORT Bool omapDebug;
80
81
82 /* Various logging/debug macros for use in the X driver and the external
83  * sub-modules:
84  */
85 #define TRACE_ENTER() \
86                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d: Entering\n",\
87                                 __FUNCTION__, __LINE__); } while (0)
88 #define TRACE_EXIT() \
89                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d: Exiting\n",\
90                                 __FUNCTION__, __LINE__); } while (0)
91 #define DEBUG_MSG(fmt, ...) \
92                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d " fmt "\n",\
93                                 __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
94 #define INFO_MSG(fmt, ...) \
95                 do { xf86DrvMsg(pScrn->scrnIndex, X_INFO, fmt "\n",\
96                                 ##__VA_ARGS__); } while (0)
97 #define CONFIG_MSG(fmt, ...) \
98                 do { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, fmt "\n",\
99                                 ##__VA_ARGS__); } while (0)
100 #define WARNING_MSG(fmt, ...) \
101                 do { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "WARNING: " fmt "\n",\
102                                 ##__VA_ARGS__); } while (0)
103 #define ERROR_MSG(fmt, ...) \
104                 do { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ERROR: " fmt "\n",\
105                                 ##__VA_ARGS__); } while (0)
106 #define EARLY_ERROR_MSG(fmt, ...) \
107                 do { xf86Msg(X_ERROR, "ERROR: " fmt "\n",\
108                                 ##__VA_ARGS__); } while (0)
109
110
111 /* Forward declarations: */
112 struct _OMAPRec;
113
114 extern unsigned int
115 OMAPCalculateStride(unsigned int fbWidth, unsigned int bitsPerPixel);
116 extern unsigned int
117 OMAPCalculateTiledStride(unsigned int width, unsigned int bitsPerPixel);
118
119
120
121 /** The driver's Screen-specific, "private" data structure. */
122 typedef struct _OMAPRec
123 {
124         /** Chipset id */
125         int                                     chipset;
126
127         /**
128          * Pointer to a structure used to communicate and coordinate with an
129          * external EXA library (if loaded).
130          */
131         OMAPEXAPtr                      pOMAPEXA;
132
133         /** various user-configurable options: */
134         Bool                            dri;
135         Bool                            HWCursor;
136         Bool                            NoAccel;
137
138         /** File descriptor of the connection with the DRM. */
139         int                                     drmFD;
140
141         char                            *deviceName;
142
143         /** DRM device instance */
144         struct omap_device      *dev;
145
146         /** Scan-out buffer. */
147         struct omap_bo          *scanout;
148
149         /** Pointer to the options for this screen. */
150         OptionInfoPtr           pOptionInfo;
151
152         /** Save (wrap) the original pScreen functions. */
153         CloseScreenProcPtr                              SavedCloseScreen;
154         CreateScreenResourcesProcPtr    SavedCreateScreenResources;
155         ScreenBlockHandlerProcPtr               SavedBlockHandler;
156
157         /** Pointer to the entity structure for this screen. */
158         EntityInfoPtr           pEntityInfo;
159
160         XF86VideoAdaptorPtr textureAdaptor;
161
162         /** Flips we are waiting for: */
163         int                                     pending_flips;
164
165 } OMAPRec, *OMAPPtr;
166
167 /*
168  * Misc utility macros:
169  */
170
171 /* do we support video? */
172 static inline Bool has_video(OMAPPtr pOMAP)
173 {
174         return pOMAP->pOMAPEXA &&
175                         pOMAP->pOMAPEXA->GetFormats &&
176                         pOMAP->pOMAPEXA->PutTextureImage;
177 }
178
179 static inline Bool has_dmm(OMAPPtr pOMAP)
180 {
181         return pOMAP->chipset >= 0x4430;
182 }
183
184 /** Return a pointer to the driver's private structure. */
185 #define OMAPPTR(p) ((OMAPPtr)((p)->driverPrivate))
186 #define OMAPPTR_FROM_SCREEN(pScreen) \
187         ((OMAPPtr)(xf86Screens[(pScreen)->myNum])->driverPrivate);
188
189 #define wrap(priv, real, mem, func) {\
190     priv->Saved##mem = real->mem; \
191     real->mem = func; \
192 }
193
194 #define unwrap(priv, real, mem) {\
195     real->mem = priv->Saved##mem; \
196 }
197
198 #define swap(priv, real, mem) {\
199     void *tmp = priv->Saved##mem; \
200     priv->Saved##mem = real->mem; \
201     real->mem = tmp; \
202 }
203
204 #define exchange(a, b) {\
205         typeof(a) tmp = a; \
206         a = b; \
207         b = tmp; \
208 }
209
210 #ifndef ARRAY_SIZE
211 #  define ARRAY_SIZE(a)  (sizeof(a) / sizeof(a[0]))
212 #endif
213 #define ALIGN(val, align)       (((val) + (align) - 1) & ~((align) - 1))
214
215
216 /**
217  * drmmode functions..
218  */
219 Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
220 void drmmode_screen_init(ScrnInfoPtr pScrn);
221 void drmmode_screen_fini(ScrnInfoPtr pScrn);
222 void drmmode_adjust_frame(ScrnInfoPtr pScrn, int x, int y, int flags);
223 void drmmode_remove_fb(ScrnInfoPtr pScrn);
224 Bool drmmode_page_flip(DrawablePtr draw, uint32_t fb_id, void *priv);
225 void drmmode_wait_for_event(ScrnInfoPtr pScrn);
226 Bool drmmode_cursor_init(ScreenPtr pScreen);
227
228
229 /**
230  * DRI2 functions..
231  */
232 typedef struct _OMAPDRISwapCmd OMAPDRISwapCmd;
233 Bool OMAPDRI2ScreenInit(ScreenPtr pScreen);
234 void OMAPDRI2CloseScreen(ScreenPtr pScreen);
235 void OMAPDRI2SwapComplete(OMAPDRISwapCmd *cmd);
236
237 /**
238  * XV functions..
239  */
240 Bool OMAPVideoScreenInit(ScreenPtr pScreen);
241 void OMAPVideoCloseScreen(ScreenPtr pScreen);
242
243 /**
244  * EXA util functions.. move to EXA core?
245  */
246
247 typedef int (*OMAPPutTextureImageProc)(
248                 PixmapPtr pSrcPix, BoxPtr pSrcBox,
249                 PixmapPtr pOsdPix, BoxPtr pOsdBox,
250                 PixmapPtr pDstPix, BoxPtr pDstBox,
251                 void *closure);
252
253 Bool OMAPVidCopyArea(DrawablePtr pSrcDraw, BoxPtr pSrcBox,
254                 DrawablePtr pOsdDraw, BoxPtr pOsdBox,
255                 DrawablePtr pDstDraw, BoxPtr pDstBox,
256                 OMAPPutTextureImageProc PutTextureImage, void *closure,
257                 RegionPtr clipBoxes);
258
259 #endif /* __OMAP_DRV_H__ */