add HW cursor support using drm-plane
[gstreamer-omap: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 "dri2.h"
58
59 #include <omap_drm.h>
60 #include <omap_drmif.h>
61
62 #include <errno.h>
63
64
65 #define OMAP_VERSION            1000    /* Apparently not used by X server */
66 #define OMAP_NAME                       "OMAP"  /* Name used to prefix messages */
67 #define OMAP_DRIVER_NAME        "omap"  /* Driver name as used in config file */
68 #define OMAP_MAJOR_VERSION      0
69 #define OMAP_MINOR_VERSION      83
70 #define OMAP_PATCHLEVEL         0
71
72 /**
73  * This controls whether debug statements (and function "trace" enter/exit)
74  * messages are sent to the log file (TRUE) or are ignored (FALSE).
75  */
76 extern _X_EXPORT Bool omapDebug;
77
78
79 /* Various logging/debug macros for use in the X driver and the external
80  * sub-modules:
81  */
82 #define TRACE_ENTER() \
83                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d: Entering\n",\
84                                 __FUNCTION__, __LINE__); } while (0)
85 #define TRACE_EXIT() \
86                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d: Exiting\n",\
87                                 __FUNCTION__, __LINE__); } while (0)
88 #define DEBUG_MSG(fmt, ...) \
89                 do { if (omapDebug) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:%d " fmt "\n",\
90                                 __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
91 #define INFO_MSG(fmt, ...) \
92                 do { xf86DrvMsg(pScrn->scrnIndex, X_INFO, fmt "\n",\
93                                 ##__VA_ARGS__); } while (0)
94 #define CONFIG_MSG(fmt, ...) \
95                 do { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, fmt "\n",\
96                                 ##__VA_ARGS__); } while (0)
97 #define WARNING_MSG(fmt, ...) \
98                 do { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "WARNING: " fmt "\n",\
99                                 ##__VA_ARGS__); } while (0)
100 #define ERROR_MSG(fmt, ...) \
101                 do { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ERROR: " fmt "\n",\
102                                 ##__VA_ARGS__); } while (0)
103 #define EARLY_ERROR_MSG(fmt, ...) \
104                 do { xf86Msg(X_ERROR, "ERROR: " fmt "\n",\
105                                 ##__VA_ARGS__); } while (0)
106
107
108 /* Forward declarations: */
109 struct _OMAPRec;
110
111 extern unsigned int
112 OMAPCalculateStride(unsigned int fbWidth, unsigned int bitsPerPixel);
113 extern unsigned int
114 OMAPCalculateTiledStride(unsigned int width, unsigned int bitsPerPixel);
115
116
117 /**
118  * A per-Screen structure used to communicate and coordinate between the OMAP X
119  * driver and an external EXA sub-module (if loaded).
120  */
121 typedef struct _OMAPEXARec
122 {
123         union { struct {
124
125         /**
126          * Called by X driver's CloseScreen() function at the end of each server
127          * generation to free per-Screen data structures (except those held by
128          * pScrn).
129          */
130         Bool (*CloseScreen)(int scrnIndex, ScreenPtr pScreen);
131
132         /**
133          * Called by X driver's FreeScreen() function at the end of each server
134          * lifetime to free per-ScrnInfoRec data structures, to close any external
135          * connections (e.g. with PVR2D, DRM), etc.
136          */
137         void (*FreeScreen)(int scrnIndex, int flags);
138
139         /* add new fields here at end, to preserve ABI */
140
141         };
142
143         /* padding to keep ABI stable, so an existing EXA submodule
144          * doesn't need to be recompiled when new fields are added
145          */
146         void *pad[64];
147         };
148
149 } OMAPEXARec, *OMAPEXAPtr;
150
151
152
153 /** The driver's Screen-specific, "private" data structure. */
154 typedef struct _OMAPRec
155 {
156         /** Chipset id */
157         int                                     chipset;
158
159         /**
160          * Pointer to a structure used to communicate and coordinate with an
161          * external EXA library (if loaded).
162          */
163         OMAPEXAPtr                      pOMAPEXA;
164
165         /** various user-configurable options: */
166         Bool                            dri;
167         Bool                            HWCursor;
168         Bool                            NoAccel;
169
170         /** File descriptor of the connection with the DRM. */
171         int                                     drmFD;
172
173         char                            *deviceName;
174
175         /** DRM device instance */
176         struct omap_device      *dev;
177
178         /** Scan-out buffer. */
179         struct omap_bo          *scanout;
180
181         /** Pointer to the options for this screen. */
182         OptionInfoPtr           pOptionInfo;
183
184         /** Save (wrap) the original pScreen functions. */
185         CloseScreenProcPtr                              SavedCloseScreen;
186         CreateScreenResourcesProcPtr    SavedCreateScreenResources;
187         ScreenBlockHandlerProcPtr               SavedBlockHandler;
188
189         /** Pointer to the entity structure for this screen. */
190         EntityInfoPtr           pEntityInfo;
191
192 } OMAPRec, *OMAPPtr;
193
194 /*
195  * Misc utility macros:
196  */
197
198 /** Return a pointer to the driver's private structure. */
199 #define OMAPPTR(p) ((OMAPPtr)((p)->driverPrivate))
200 #define OMAPPTR_FROM_SCREEN(pScreen) \
201         ((OMAPPtr)(xf86Screens[(pScreen)->myNum])->driverPrivate);
202
203 #define wrap(priv, real, mem, func) {\
204     priv->Saved##mem = real->mem; \
205     real->mem = func; \
206 }
207
208 #define unwrap(priv, real, mem) {\
209     real->mem = priv->Saved##mem; \
210 }
211
212 #define swap(priv, real, mem) {\
213     void *tmp = priv->Saved##mem; \
214     priv->Saved##mem = real->mem; \
215     real->mem = tmp; \
216 }
217
218 #define exchange(a, b) {\
219         typeof(a) tmp = a; \
220         a = b; \
221         b = tmp; \
222 }
223
224 /**
225  * Canonical name of an external sub-module providing support for EXA
226  * acceleration, that utiltizes the OMAP's PowerVR accelerator and uses closed
227  * source from Imaginations Technology Limited.
228  */
229 #define SUB_MODULE_PVR  "omap_pvr"
230 OMAPEXAPtr InitPowerVREXA(ScreenPtr pScreen, ScrnInfoPtr pScrn);
231
232 /**
233  * Fallback EXA implementation
234  */
235 OMAPEXAPtr InitNullEXA(ScreenPtr pScreen, ScrnInfoPtr pScrn);
236
237 /**
238  * drmmode functions..
239  */
240 Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
241 void drmmode_screen_init(ScrnInfoPtr pScrn);
242 void drmmode_screen_fini(ScrnInfoPtr pScrn);
243 void drmmode_adjust_frame(ScrnInfoPtr pScrn, int x, int y, int flags);
244 void drmmode_remove_fb(ScrnInfoPtr pScrn);
245 Bool drmmode_page_flip(DrawablePtr draw, uint32_t fb_id, void *priv);
246 Bool drmmode_cursor_init(ScreenPtr pScreen);
247
248
249 /**
250  * DRI2 functions..
251  */
252 typedef struct _OMAPDRISwapCmd OMAPDRISwapCmd;
253 Bool OMAPDRI2ScreenInit(ScreenPtr pScreen);
254 void OMAPDRI2CloseScreen(ScreenPtr pScreen);
255 void OMAPDRI2SwapComplete(OMAPDRISwapCmd *cmd);
256
257 #endif /* OMAP_DRV_H_ */