1From 5216cb0f14414b5451f58df48a36c1c62c035276 Mon Sep 17 00:00:00 2001
2From: Otavio Salvador <otavio@ossystems.com.br>
3Date: Sat, 29 Dec 2012 18:02:11 -0200
4Subject: [PATCH] Make video API forward and backward compatible
5
6This updates the video API in a forward and backward compatible way
7using the "compat-api.h" as used in Xorg maintained drivers.
8
9Upstream-Status: Pending
10
11Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
12---
13 src/compat-api.h        |  106 +++++++++++++++++++++++++++++++++++++++++++++++
14 src/imx_display.c       |   22 +++++-----
15 src/imx_display.h       |    8 ++--
16 src/imx_driver.c        |   60 ++++++++++++++-------------
17 src/imx_exa_offscreen.c |   12 +++---
18 src/imx_exa_z160.c      |   53 ++++++++++++------------
19 src/imx_xv_ipu.c        |    4 +-
20 7 files changed, 188 insertions(+), 77 deletions(-)
21 create mode 100644 src/compat-api.h
22
23diff --git a/src/compat-api.h b/src/compat-api.h
24new file mode 100644
25index 0000000..73ac8a2
26--- /dev/null
27+++ b/src/compat-api.h
28@@ -0,0 +1,106 @@
29+/*
30+ * Copyright 2012 Red Hat, Inc.
31+ *
32+ * Permission is hereby granted, free of charge, to any person obtaining a
33+ * copy of this software and associated documentation files (the "Software"),
34+ * to deal in the Software without restriction, including without limitation
35+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
36+ * and/or sell copies of the Software, and to permit persons to whom the
37+ * Software is furnished to do so, subject to the following conditions:
38+ *
39+ * The above copyright notice and this permission notice (including the next
40+ * paragraph) shall be included in all copies or substantial portions of the
41+ * Software.
42+ *
43+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
46+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
48+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
49+ * DEALINGS IN THE SOFTWARE.
50+ *
51+ * Author: Dave Airlie <airlied@redhat.com>
52+ */
53+
54+/* this file provides API compat between server post 1.13 and pre it,
55+   it should be reused inside as many drivers as possible */
56+#ifndef COMPAT_API_H
57+#define COMPAT_API_H
58+
59+#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
60+#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
61+#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
62+#endif
63+
64+#ifndef XF86_HAS_SCRN_CONV
65+#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
66+#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
67+#endif
68+
69+#ifndef XF86_SCRN_INTERFACE
70+
71+#define SCRN_ARG_TYPE int
72+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)]
73+
74+#define SCREEN_ARG_TYPE int
75+#define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)]
76+
77+#define SCREEN_INIT_ARGS_DECL int index, ScreenPtr pScreen, int argc, char **argv
78+
79+#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask
80+#define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask
81+
82+#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen
83+#define CLOSE_SCREEN_ARGS scrnIndex, pScreen
84+#define CLOSE_SCREEN_DECL_ScrnInfoPtr ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
85+
86+#define FBDEVHWADJUSTFRAME_ARGS(x, y) scrnIndex, (x), (y), 0
87+
88+#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags
89+
90+#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags
91+
92+#define FREE_SCREEN_ARGS_DECL int arg, int flags
93+#define FREE_SCREEN_ARGS(x) (x)->scrnIndex, 0
94+
95+#define VT_FUNC_ARGS_DECL int arg, int flags
96+#define VT_FUNC_ARGS(flags) pScrn->scrnIndex, (flags)
97+
98+#define ENABLE_DISABLE_FB_ACCESS_ARGS(pScrn, b) pScrn->scrnIndex, b
99+
100+#define XF86_ENABLEDISABLEFB_ARG(x) ((x)->scrnIndex)
101+#else
102+#define SCRN_ARG_TYPE ScrnInfoPtr
103+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1)
104+
105+#define SCREEN_ARG_TYPE ScreenPtr
106+#define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1)
107+
108+#define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv
109+
110+#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask
111+#define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask
112+
113+#define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen
114+#define CLOSE_SCREEN_ARGS pScreen
115+#define CLOSE_SCREEN_DECL_ScrnInfoPtr ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
116+
117+#define FBDEVHWADJUSTFRAME_ARGS(x, y) pScrn, (x), (y)
118+
119+#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y
120+#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode
121+
122+#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg
123+#define FREE_SCREEN_ARGS(x) (x)
124+
125+#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg
126+#define VT_FUNC_ARGS(flags) pScrn
127+
128+#define ENABLE_DISABLE_FB_ACCESS_ARGS(pScrn, b) pScrn, b
129+
130+#define XF86_ENABLEDISABLEFB_ARG(x) (x)
131+
132+#endif
133+
134+#endif
135diff --git a/src/imx_display.c b/src/imx_display.c
136index fcb8195..e2dc36a 100644
137--- a/src/imx_display.c
138+++ b/src/imx_display.c
139@@ -42,6 +42,8 @@
140 #include "imx.h"
141 #include "imx_display.h"
142
143+#include "compat-api.h"
144+
145 #include <X11/Xatom.h>
146
147 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,6,0,0)
148@@ -1373,19 +1375,19 @@ imxDisplayPreInit(ScrnInfoPtr pScrn)
149 Bool
150 imxDisplayStartScreenInit(int scrnIndex, ScreenPtr pScreen)
151 {
152-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
153+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
154 	ImxPtr fPtr = IMXPTR(pScrn);
155
156 	if (!xf86SetDesiredModes(pScrn)) {
157
158-		xf86DrvMsg(scrnIndex, X_ERROR, "mode initialization failed\n");
159+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "mode initialization failed\n");
160 		return FALSE;
161 	}
162
163 #if 0
164 	if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) {
165
166-		xf86DrvMsg(scrnIndex, X_ERROR, "mode initialization failed\n");
167+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "mode initialization failed\n");
168 		return FALSE;
169 	}
170 	pScrn->displayWidth =
171@@ -1463,29 +1465,29 @@ imxDisplayFinishScreenInit(int scrnIndex, ScreenPtr pScreen)
172 /* -------------------------------------------------------------------- */
173
174 Bool
175-imxDisplaySwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
176+imxDisplaySwitchMode(SWITCH_MODE_ARGS_DECL)
177 {
178-	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
179+	SCRN_INFO_PTR(arg);
180
181 	return xf86SetSingleMode(pScrn, mode, RR_Rotate_0);
182 }
183
184 void
185-imxDisplayAdjustFrame(int scrnIndex, int x, int y, int flags)
186+imxDisplayAdjustFrame(ADJUST_FRAME_ARGS_DECL)
187 {
188-//	fbdevHWAdjustFrame(scrnIndex, x, y, flags);
189+//	fbdevHWAdjustFrame(pScrn->scrnIndex, x, y, flags);
190 }
191
192 Bool
193-imxDisplayEnterVT(int scrnIndex, int flags)
194+imxDisplayEnterVT(VT_FUNC_ARGS_DECL)
195 {
196-	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
197+	SCRN_INFO_PTR(arg);
198
199 	return xf86SetDesiredModes(pScrn);
200 }
201
202 void
203-imxDisplayLeaveVT(int scrnIndex, int flags)
204+imxDisplayLeaveVT(VT_FUNC_ARGS_DECL)
205 {
206 }
207
208diff --git a/src/imx_display.h b/src/imx_display.h
209index 4a5d5aa..3a3d43a 100644
210--- a/src/imx_display.h
211+++ b/src/imx_display.h
212@@ -59,16 +59,16 @@ imxDisplayValidMode(int scrnIndex, DisplayModePtr mode,
213 			Bool verbose, int flags);
214
215 extern Bool
216-imxDisplaySwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
217+imxDisplaySwitchMode(SWITCH_MODE_ARGS_DECL);
218
219 extern void
220-imxDisplayAdjustFrame(int scrnIndex, int x, int y, int flags);
221+imxDisplayAdjustFrame(ADJUST_FRAME_ARGS_DECL);
222
223 extern Bool
224-imxDisplayEnterVT(int scrnIndex, int flags);
225+imxDisplayEnterVT(VT_FUNC_ARGS_DECL);
226
227 extern void
228-imxDisplayLeaveVT(int scrnIndex, int flags);
229+imxDisplayLeaveVT(VT_FUNC_ARGS_DECL);
230
231 extern Bool
232 imxDisplayChangeFrameBufferRotateEPDC(int scrnIndex, int fbRotate);
233diff --git a/src/imx_driver.c b/src/imx_driver.c
234index 178e36e..f4b3e38 100644
235--- a/src/imx_driver.c
236+++ b/src/imx_driver.c
237@@ -46,6 +46,8 @@
238 #include "fb.h"
239 #include "fbdevhw.h"
240
241+#include "compat-api.h"
242+
243 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
244 #include "xf86Resources.h"
245 #include "xf86RAC.h"
246@@ -435,17 +437,17 @@ errorPreInit:
247 }
248
249 static void
250-imxFreeScreen(int scrnIndex, int flags)
251+imxFreeScreen(FREE_SCREEN_ARGS_DECL)
252 {
253-	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
254+	SCRN_INFO_PTR(arg);
255
256 	imxFreeRec(pScrn);
257 }
258
259 static Bool
260-imxCloseScreen(int scrnIndex, ScreenPtr pScreen)
261+imxCloseScreen(CLOSE_SCREEN_ARGS_DECL)
262 {
263-	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
264+	CLOSE_SCREEN_DECL_ScrnInfoPtr;
265 	ImxPtr fPtr = IMXPTR(pScrn);
266
267 	fbdevHWRestore(pScrn);
268@@ -453,7 +455,7 @@ imxCloseScreen(int scrnIndex, ScreenPtr pScreen)
269 	pScrn->vtSema = FALSE;
270
271 	pScreen->CloseScreen = fPtr->saveCloseScreen;
272-	return (*pScreen->CloseScreen)(scrnIndex, pScreen);
273+	return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
274 }
275
276 static int
277@@ -488,9 +490,9 @@ LCM(a, b)
278 }
279
280 static Bool
281-imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
282+imxScreenInit(SCREEN_INIT_ARGS_DECL)
283 {
284-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
285+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
286 	ImxPtr fPtr = IMXPTR(pScrn);
287 	VisualPtr visual;
288 	int init_picture = 0;
289@@ -514,7 +516,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
290 	/* Map frame buffer memory */
291 	fPtr->fbMemoryBase = fbdevHWMapVidmem(pScrn);
292 	if (NULL == fPtr->fbMemoryBase) {
293-	        xf86DrvMsg(scrnIndex,X_ERROR,"mapping of video memory"
294+	        xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mapping of video memory"
295 			   " failed\n");
296 		return FALSE;
297 	}
298@@ -558,7 +560,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
299 	const int fbOffsetScreen2 =
300 		IMX_ALIGN(fbMaxScreenSize, fbMaxAlignOffset);
301 	fPtr->fbMemoryScreenReserve = fbMaxScreenSize;
302-	xf86DrvMsg(scrnIndex, X_INFO,
303+	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
304 		"reserve %d bytes of frame buffer for screen\n",
305 		fPtr->fbMemoryScreenReserve);
306 	fPtr->fbMemoryStart2 = NULL;
307@@ -568,12 +570,12 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
308
309 		fPtr->fbMemoryScreenReserve += fbOffsetScreen2;
310
311-		xf86DrvMsg(scrnIndex, X_INFO,
312+		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
313 			"reserve same number of bytes for XRandR rotated screen at offset %d\n",
314 			fbOffsetScreen2);
315 	}
316
317-	if (!imxDisplayStartScreenInit(scrnIndex, pScreen)) {
318+	if (!imxDisplayStartScreenInit(pScrn->scrnIndex, pScreen)) {
319
320 		return FALSE;
321 	}
322@@ -582,7 +584,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
323 	miClearVisualTypes();
324 	if (pScrn->bitsPerPixel > 8) {
325 		if (!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits, TrueColor)) {
326-			xf86DrvMsg(scrnIndex,X_ERROR,"visual type setup failed"
327+			xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"visual type setup failed"
328 				   " for %d bits per pixel [1]\n",
329 				   pScrn->bitsPerPixel);
330 			return FALSE;
331@@ -591,14 +593,14 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
332 		if (!miSetVisualTypes(pScrn->depth,
333 				      miGetDefaultVisualMask(pScrn->depth),
334 				      pScrn->rgbBits, pScrn->defaultVisual)) {
335-			xf86DrvMsg(scrnIndex,X_ERROR,"visual type setup failed"
336+			xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"visual type setup failed"
337 				   " for %d bits per pixel [2]\n",
338 				   pScrn->bitsPerPixel);
339 			return FALSE;
340 		}
341 	}
342 	if (!miSetPixmapDepths()) {
343-	  xf86DrvMsg(scrnIndex,X_ERROR,"pixmap depth setup failed\n");
344+	  xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"pixmap depth setup failed\n");
345 	  return FALSE;
346 	}
347
348@@ -607,10 +609,10 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
349 		has a padding which is independent from the depth (controlfb) */
350 	pScrn->displayWidth = fbdevHWGetLineLength(pScrn) /
351 			      (pScrn->bitsPerPixel / 8);
352-	xf86DrvMsg(scrnIndex, X_INFO, "displayWidth = %d\n", pScrn->displayWidth);
353+	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "displayWidth = %d\n", pScrn->displayWidth);
354
355 	if (pScrn->displayWidth != pScrn->virtualX) {
356-		xf86DrvMsg(scrnIndex, X_INFO,
357+		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
358 			   "Pitch updated to %d after ModeInit\n",
359 			   pScrn->displayWidth);
360 	}
361@@ -633,7 +635,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
362 			init_picture = 1;
363 			break;
364 	 	default:
365-			xf86DrvMsg(scrnIndex, X_ERROR,
366+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
367 				   "internal error: invalid number of bits per"
368 				   " pixel (%d) encountered in"
369 				   " imxScreenInit()\n", pScrn->bitsPerPixel);
370@@ -644,7 +646,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
371 	case FBDEVHW_INTERLEAVED_PLANES:
372 		/* This should never happen ...
373 		* we should check for this much much earlier ... */
374-		xf86DrvMsg(scrnIndex, X_ERROR,
375+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
376 		           "internal error: interleaved planes are not yet "
377 			   "supported by the imx driver\n");
378 		ret = FALSE;
379@@ -652,20 +654,20 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
380 	case FBDEVHW_TEXT:
381 		/* This should never happen ...
382 		* we should check for this much much earlier ... */
383-		xf86DrvMsg(scrnIndex, X_ERROR,
384+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
385 		           "internal error: text mode is not supported by the "
386 			   "imx driver\n");
387 		ret = FALSE;
388 		break;
389 	case FBDEVHW_VGA_PLANES:
390 		/* Not supported yet */
391-		xf86DrvMsg(scrnIndex, X_ERROR,
392+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
393 		           "internal error: EGA/VGA Planes are not yet "
394 			   "supported by the imx driver\n");
395 		ret = FALSE;
396 		break;
397 	default:
398-		xf86DrvMsg(scrnIndex, X_ERROR,
399+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
400 		           "internal error: unrecognised hardware type (%d) "
401 			   "encountered in imxScreenInit()\n", type);
402 		ret = FALSE;
403@@ -699,7 +701,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
404 	/* INIT ACCELERATION BEFORE INIT FOR BACKING STORE & SOFTWARE CURSOR */
405 	if (fPtr->useAccel) {
406
407-		if (!imxExaZ160Setup(scrnIndex, pScreen)) {
408+		if (!imxExaZ160Setup(pScrn->scrnIndex, pScreen)) {
409
410 			fPtr->useAccel = FALSE;
411 		}
412@@ -731,29 +733,29 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
413 	/* XXX It would be simpler to use miCreateDefColormap() in all cases. */
414 	case FBDEVHW_PACKED_PIXELS:
415 		if (!miCreateDefColormap(pScreen)) {
416-			xf86DrvMsg(scrnIndex, X_ERROR,
417+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
418                                    "internal error: miCreateDefColormap failed "
419 				   "in imxScreenInit()\n");
420 			return FALSE;
421 		}
422 		break;
423 	case FBDEVHW_INTERLEAVED_PLANES:
424-		xf86DrvMsg(scrnIndex, X_ERROR,
425+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
426 		           "internal error: interleaved planes are not yet "
427 			   "supported by the imx driver\n");
428 		return FALSE;
429 	case FBDEVHW_TEXT:
430-		xf86DrvMsg(scrnIndex, X_ERROR,
431+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
432 		           "internal error: text mode is not supported by "
433 			   "the imx driver\n");
434 		return FALSE;
435 	case FBDEVHW_VGA_PLANES:
436-		xf86DrvMsg(scrnIndex, X_ERROR,
437+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
438 		           "internal error: EGA/VGA planes are not yet "
439 			   "supported by the imx driver\n");
440 		return FALSE;
441 	default:
442-		xf86DrvMsg(scrnIndex, X_ERROR,
443+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
444 		           "internal error: unrecognised imx hardware type "
445 			   "(%d) encountered in imxScreenInit()\n", type);
446 		return FALSE;
447@@ -782,7 +784,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
448 	}
449 #endif
450
451-	if (!imxDisplayFinishScreenInit(scrnIndex, pScreen)) {
452+	if (!imxDisplayFinishScreenInit(pScrn->scrnIndex, pScreen)) {
453 		return FALSE;
454 	}
455
456@@ -810,7 +812,7 @@ IMXGetPixmapProperties(
457 	}
458
459 	/* Access screen associated with this pixmap. */
460-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
461+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
462
463 	/* Check if the screen associated with this pixmap has IMX driver. */
464 	if (0 != strcmp(IMX_DRIVER_NAME, pScrn->driverName)) {
465diff --git a/src/imx_exa_offscreen.c b/src/imx_exa_offscreen.c
466index 3a5c24d..0fbe2fc 100644
467--- a/src/imx_exa_offscreen.c
468+++ b/src/imx_exa_offscreen.c
469@@ -79,7 +79,7 @@ static void
470 imxExaOffscreenValidate (ScreenPtr pScreen)
471 {
472     /* Access the driver specific data. */
473-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
474+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
475     ImxPtr imxPtr = IMXPTR(pScrn);
476     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
477     ExaOffscreenArea *prev = 0, *area;
478@@ -135,7 +135,7 @@ imxExaOffscreenMerge (ImxExaPtr imxExaPtr, ExaOffscreenArea *area)
479 ExaOffscreenArea *
480 imxExaOffscreenFree (ScreenPtr pScreen, ExaOffscreenArea *area)
481 {
482-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
483+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
484     ImxPtr imxPtr = IMXPTR(pScrn);
485     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
486     ExaOffscreenArea	*next = area->next;
487@@ -281,7 +281,7 @@ imxExaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
488                    pointer privData)
489 {
490     ExaOffscreenArea *area;
491-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
492+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
493     ImxPtr imxPtr = IMXPTR(pScrn);
494     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
495     int real_size = 0, largest_avail = 0;
496@@ -418,7 +418,7 @@ imxExaOffscreenSwapIn (ScreenPtr pScreen)
497 Bool
498 imxExaOffscreenInit (ScreenPtr pScreen)
499 {
500-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
501+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
502     ImxPtr imxPtr = IMXPTR(pScrn);
503     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
504     ExaOffscreenArea *area;
505@@ -453,7 +453,7 @@ imxExaOffscreenInit (ScreenPtr pScreen)
506 void
507 imxExaOffscreenFini (ScreenPtr pScreen)
508 {
509-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
510+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
511     ImxPtr imxPtr = IMXPTR(pScrn);
512     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
513     ExaOffscreenArea *area;
514@@ -472,7 +472,7 @@ imxExaOffscreenFini (ScreenPtr pScreen)
515 void
516 imxExaOffscreenSwapOut (ScreenPtr pScreen)
517 {
518-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
519+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
520     ImxPtr imxPtr = IMXPTR(pScrn);
521     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
522
523diff --git a/src/imx_exa_z160.c b/src/imx_exa_z160.c
524index fb718e0..3d0bc96 100644
525--- a/src/imx_exa_z160.c
526+++ b/src/imx_exa_z160.c
527@@ -32,6 +32,7 @@
528 #include <errno.h>
529 #include <fcntl.h>
530
531+#include "compat-api.h"
532
533 /* Set if handles pixmap allocation and migration, i.e, EXA_HANDLES_PIXMAPS */
534 #define	IMX_EXA_ENABLE_HANDLES_PIXMAPS	\
535@@ -299,7 +300,7 @@ imxExaZ160GetPixmapAddress(PixmapPtr pPixmap)
536 	return fPixmapPtr->ptr;
537 #else
538 	/* Access screen associated with this pixmap. */
539-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
540+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
541
542 	/* Access driver specific data */
543 	ImxPtr imxPtr = IMXPTR(pScrn);
544@@ -344,7 +345,7 @@ imxExaZ160GetPixmapProperties(
545 #else
546
547 	/* Access screen associated with this pixmap. */
548-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
549+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
550
551 	/* Make sure pixmap is in framebuffer */
552 	if (!exaDrawableIsOffscreen(&(pPixmap->drawable))) {
553@@ -856,7 +857,7 @@ imxExaZ160SyncIfBusyPixmap(PixmapPtr pPixmap)
554 {
555 	/* Access screen associated with this pixmap. */
556 	ScreenPtr pScreen = pPixmap->drawable.pScreen;
557-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
558+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
559
560 	/* Access driver specific data for screen. */
561 	ImxPtr imxPtr = IMXPTR(pScrn);
562@@ -924,7 +925,7 @@ imxExaZ160CreatePixmap2(ScreenPtr pScreen, int width, int height,
563 	}
564
565 	/* Access the driver specific data. */
566-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
567+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
568 	ImxPtr imxPtr = IMXPTR(pScrn);
569 	ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
570
571@@ -1028,7 +1029,7 @@ imxExaZ160DestroyPixmap(ScreenPtr pScreen, void *driverPriv)
572 	ImxExaPixmapPtr fPixmapPtr = (ImxExaPixmapPtr)driverPriv;
573
574 	/* Access the driver specific data. */
575-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
576+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
577 	ImxPtr imxPtr = IMXPTR(pScrn);
578 	ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
579
580@@ -1068,7 +1069,7 @@ imxExaZ160ModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
581 	}
582
583 	/* Access screen associated with this pixmap */
584-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
585+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
586
587 	/* Access driver specific data */
588 	ImxPtr imxPtr = IMXPTR(pScrn);
589@@ -1194,7 +1195,7 @@ imxExaZ160TrackBusyPixmap(ImxExaZ160Ptr fPtr, PixmapPtr pPixmap)
590 static void
591 imxExaZ160WaitMarker(ScreenPtr pScreen, int marker)
592 {
593-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
594+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
595
596 	/* Access driver specific data associated with the screen. */
597 	ImxPtr imxPtr = IMXPTR(pScrn);
598@@ -1249,7 +1250,7 @@ imxExaZ160PrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
599 	}
600
601 	/* Access screen associated with this pixmap */
602-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
603+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
604
605 	/* Access driver specific data */
606 	ImxPtr imxPtr = IMXPTR(pScrn);
607@@ -1352,7 +1353,7 @@ static void
608 imxExaZ160Solid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
609 {
610 	/* Access screen associated with this pixmap */
611-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
612+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
613
614 	/* Access driver specific data */
615 	ImxPtr imxPtr = IMXPTR(pScrn);
616@@ -1423,7 +1424,7 @@ static void
617 imxExaZ160DoneSolid(PixmapPtr pPixmap)
618 {
619 	/* Access screen associated with this pixmap */
620-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
621+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
622
623 	/* Access driver specific data */
624 	ImxPtr imxPtr = IMXPTR(pScrn);
625@@ -1485,7 +1486,7 @@ imxExaZ160PrepareCopy(
626 	}
627
628 	/* Access the screen associated with this pixmap. */
629-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
630+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
631
632 	/* Access driver specific data */
633 	ImxPtr imxPtr = IMXPTR(pScrn);
634@@ -1599,7 +1600,7 @@ static void
635 imxExaZ160Copy(PixmapPtr pPixmapDst, int srcX, int srcY, int dstX, int dstY, int width, int height)
636 {
637 	/* Access screen associated with dst pixmap */
638-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
639+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
640
641 	/* Access driver specific data */
642 	ImxPtr imxPtr = IMXPTR(pScrn);
643@@ -1661,7 +1662,7 @@ static void
644 imxExaZ160DoneCopy(PixmapPtr pPixmapDst)
645 {
646 	/* Access screen associated with this pixmap */
647-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
648+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
649
650 	/* Access driver specific data */
651 	ImxPtr imxPtr = IMXPTR(pScrn);
652@@ -1770,7 +1771,7 @@ imxExaZ160CheckComposite(int op, PicturePtr pPictureSrc, PicturePtr pPictureMask
653 	}
654
655 	/* Access screen associated with dst pixmap (same screen as for src pixmap). */
656-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
657+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
658
659 	/* Check the number of entities, and fail if it isn't one. */
660 	if (pScrn->numEntities != 1) {
661@@ -1987,7 +1988,7 @@ imxExaZ160PrepareComposite(
662 {
663 	/* Access screen associated with dst pixmap. */
664 	/* Should be same screen as for src pixmap. */
665-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
666+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
667
668 	/* NOTE - many preconditions already verified in CheckComposite. */
669
670@@ -2196,7 +2197,7 @@ imxExaZ160Composite(
671 	int height)
672 {
673 	/* Access screen associated with dst pixmap */
674-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
675+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
676
677 	/* Access driver specific data */
678 	ImxPtr imxPtr = IMXPTR(pScrn);
679@@ -2275,7 +2276,7 @@ static void
680 imxExaZ160DoneComposite(PixmapPtr pPixmapDst)
681 {
682 	/* Access screen associated with this pixmap */
683-	ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
684+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
685
686 	/* Access driver specific data */
687 	ImxPtr imxPtr = IMXPTR(pScrn);
688@@ -2323,7 +2324,7 @@ imxExaZ160UploadToScreen(
689
690 	/* Access screen associated with this pixmap */
691 	ScreenPtr pScreen = pPixmapDst->drawable.pScreen;
692-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
693+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
694
695 	/* Access driver specific data */
696 	ImxPtr imxPtr = IMXPTR(pScrn);
697@@ -2381,7 +2382,7 @@ imxExaZ160DownloadFromScreen(
698
699 	/* Access screen associated with this pixmap */
700 	ScreenPtr pScreen = pPixmapSrc->drawable.pScreen;
701-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
702+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
703
704 	/* Access driver specific data */
705 	ImxPtr imxPtr = IMXPTR(pScrn);
706@@ -2412,9 +2413,9 @@ imxExaZ160DownloadFromScreen(
707 }
708
709 Bool
710-imxExaZ160CloseScreen(int scrnIndex, ScreenPtr pScreen)
711+imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS_DECL)
712 {
713-	ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
714+	CLOSE_SCREEN_DECL_ScrnInfoPtr;
715 	ImxPtr imxPtr = IMXPTR(pScrn);
716
717 	ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
718@@ -2504,7 +2505,7 @@ imxExaZ160CloseScreen(int scrnIndex, ScreenPtr pScreen)
719 	/* Install our CloseScreen function so that it gets called. */
720 	if (NULL != pScreen->CloseScreen) {
721
722-		return (*pScreen->CloseScreen)(scrnIndex, pScreen);
723+		return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
724 	}
725
726 	return TRUE;
727@@ -2514,7 +2515,7 @@ Bool
728 imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
729 {
730 	/* Access the screen info and then private data structures. */
731-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
732+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
733 	ImxPtr imxPtr = IMXPTR(pScrn);
734
735 	/* Private data structure must not already be in use. */
736@@ -2582,7 +2583,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
737
738 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
739 			"Initialize Z160 interfaces failed.\n");
740-		imxExaZ160CloseScreen(scrnIndex, pScreen);
741+		imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
742 		return FALSE;
743 	}
744
745@@ -2592,7 +2593,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
746
747 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
748 			"Allocate EXA driver structure.\n");
749-		imxExaZ160CloseScreen(scrnIndex, pScreen);
750+		imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
751 		return FALSE;
752 	}
753
754@@ -2657,7 +2658,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
755 	if (!exaDriverInit(pScreen, exaDriverPtr)) {
756
757 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "EXA initialization failed.\n");
758-		imxExaZ160CloseScreen(scrnIndex, pScreen);
759+		imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
760 		return FALSE;
761 	}
762 	fPtr->imxExaRec.exaDriverPtr = exaDriverPtr;
763diff --git a/src/imx_xv_ipu.c b/src/imx_xv_ipu.c
764index a517742..fc8a827 100644
765--- a/src/imx_xv_ipu.c
766+++ b/src/imx_xv_ipu.c
767@@ -398,7 +398,7 @@ xf86XVFillKeyHelper1 (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
768 	xRectangle *rects;
769 	GCPtr gc;
770
771-	if(!xf86Screens[pScreen->myNum]->vtSema) return;
772+	if(!xf86ScreenToScrn(pScreen)->vtSema) return;
773
774 	gc = GetScratchGC(root->depth, pScreen);
775 	pval[0] = key;
776@@ -771,7 +771,7 @@ MXXVInitializeAdaptor
777 	XF86VideoAdaptorPtr **pppAdaptor
778 )
779 {
780-	ScreenPtr           pScreen    = screenInfo.screens[pScreenInfo->scrnIndex];
781+	ScreenPtr           pScreen    = xf86ScrnToScreen(pScreenInfo);
782 	XF86VideoAdaptorPtr *ppAdaptor = NULL;
783 	IMXPtr fPtr = IMXPTR(pScreenInfo);
784 	int                 nAdaptor;
785--
7861.7.10.4
787
788