The cirros image was rebuilt against the 3.13.0-83 kernel, drivers e1000e, igbvf...
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / buildroot-2015.05 / package / x11r7 / xdriver_xf86-video-imx / 0004-Make-video-API-forward-and-backward-compatible.patch
diff --git a/cirros-testvm/src-cirros/buildroot-2015.05/package/x11r7/xdriver_xf86-video-imx/0004-Make-video-API-forward-and-backward-compatible.patch b/cirros-testvm/src-cirros/buildroot-2015.05/package/x11r7/xdriver_xf86-video-imx/0004-Make-video-API-forward-and-backward-compatible.patch
new file mode 100644 (file)
index 0000000..2ac6311
--- /dev/null
@@ -0,0 +1,787 @@
+From 5216cb0f14414b5451f58df48a36c1c62c035276 Mon Sep 17 00:00:00 2001
+From: Otavio Salvador <otavio@ossystems.com.br>
+Date: Sat, 29 Dec 2012 18:02:11 -0200
+Subject: [PATCH] Make video API forward and backward compatible
+
+This updates the video API in a forward and backward compatible way
+using the "compat-api.h" as used in Xorg maintained drivers.
+
+Upstream-Status: Pending
+
+Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
+---
+ src/compat-api.h        |  106 +++++++++++++++++++++++++++++++++++++++++++++++
+ src/imx_display.c       |   22 +++++-----
+ src/imx_display.h       |    8 ++--
+ src/imx_driver.c        |   60 ++++++++++++++-------------
+ src/imx_exa_offscreen.c |   12 +++---
+ src/imx_exa_z160.c      |   53 ++++++++++++------------
+ src/imx_xv_ipu.c        |    4 +-
+ 7 files changed, 188 insertions(+), 77 deletions(-)
+ create mode 100644 src/compat-api.h
+
+diff --git a/src/compat-api.h b/src/compat-api.h
+new file mode 100644
+index 0000000..73ac8a2
+--- /dev/null
++++ b/src/compat-api.h
+@@ -0,0 +1,106 @@
++/*
++ * Copyright 2012 Red Hat, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ * Author: Dave Airlie <airlied@redhat.com>
++ */
++
++/* this file provides API compat between server post 1.13 and pre it,
++   it should be reused inside as many drivers as possible */
++#ifndef COMPAT_API_H
++#define COMPAT_API_H
++
++#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
++#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
++#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
++#endif
++
++#ifndef XF86_HAS_SCRN_CONV
++#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
++#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
++#endif
++
++#ifndef XF86_SCRN_INTERFACE
++
++#define SCRN_ARG_TYPE int
++#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)]
++
++#define SCREEN_ARG_TYPE int
++#define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)]
++
++#define SCREEN_INIT_ARGS_DECL int index, ScreenPtr pScreen, int argc, char **argv
++
++#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask
++#define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask
++
++#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen
++#define CLOSE_SCREEN_ARGS scrnIndex, pScreen
++#define CLOSE_SCREEN_DECL_ScrnInfoPtr ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++
++#define FBDEVHWADJUSTFRAME_ARGS(x, y) scrnIndex, (x), (y), 0
++
++#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags
++
++#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags
++
++#define FREE_SCREEN_ARGS_DECL int arg, int flags
++#define FREE_SCREEN_ARGS(x) (x)->scrnIndex, 0
++
++#define VT_FUNC_ARGS_DECL int arg, int flags
++#define VT_FUNC_ARGS(flags) pScrn->scrnIndex, (flags)
++
++#define ENABLE_DISABLE_FB_ACCESS_ARGS(pScrn, b) pScrn->scrnIndex, b
++
++#define XF86_ENABLEDISABLEFB_ARG(x) ((x)->scrnIndex)
++#else
++#define SCRN_ARG_TYPE ScrnInfoPtr
++#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1)
++
++#define SCREEN_ARG_TYPE ScreenPtr
++#define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1)
++
++#define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv
++
++#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask
++#define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask
++
++#define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen
++#define CLOSE_SCREEN_ARGS pScreen
++#define CLOSE_SCREEN_DECL_ScrnInfoPtr ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++
++#define FBDEVHWADJUSTFRAME_ARGS(x, y) pScrn, (x), (y)
++
++#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y
++#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode
++
++#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg
++#define FREE_SCREEN_ARGS(x) (x)
++
++#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg
++#define VT_FUNC_ARGS(flags) pScrn
++
++#define ENABLE_DISABLE_FB_ACCESS_ARGS(pScrn, b) pScrn, b
++
++#define XF86_ENABLEDISABLEFB_ARG(x) (x)
++
++#endif
++
++#endif
+diff --git a/src/imx_display.c b/src/imx_display.c
+index fcb8195..e2dc36a 100644
+--- a/src/imx_display.c
++++ b/src/imx_display.c
+@@ -42,6 +42,8 @@
+ #include "imx.h"
+ #include "imx_display.h"
++#include "compat-api.h"
++
+ #include <X11/Xatom.h>
+ #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,6,0,0)
+@@ -1373,19 +1375,19 @@ imxDisplayPreInit(ScrnInfoPtr pScrn)
+ Bool
+ imxDisplayStartScreenInit(int scrnIndex, ScreenPtr pScreen)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       ImxPtr fPtr = IMXPTR(pScrn);
+       if (!xf86SetDesiredModes(pScrn)) {
+-              xf86DrvMsg(scrnIndex, X_ERROR, "mode initialization failed\n");
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "mode initialization failed\n");
+               return FALSE;
+       }
+ #if 0
+       if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) {
+-              xf86DrvMsg(scrnIndex, X_ERROR, "mode initialization failed\n");
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "mode initialization failed\n");
+               return FALSE;
+       }
+       pScrn->displayWidth =
+@@ -1463,29 +1465,29 @@ imxDisplayFinishScreenInit(int scrnIndex, ScreenPtr pScreen)
+ /* -------------------------------------------------------------------- */
+ Bool
+-imxDisplaySwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
++imxDisplaySwitchMode(SWITCH_MODE_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++      SCRN_INFO_PTR(arg);
+       return xf86SetSingleMode(pScrn, mode, RR_Rotate_0);
+ }
+ void
+-imxDisplayAdjustFrame(int scrnIndex, int x, int y, int flags)
++imxDisplayAdjustFrame(ADJUST_FRAME_ARGS_DECL)
+ {
+-//    fbdevHWAdjustFrame(scrnIndex, x, y, flags);
++//    fbdevHWAdjustFrame(pScrn->scrnIndex, x, y, flags);
+ }
+ Bool
+-imxDisplayEnterVT(int scrnIndex, int flags)
++imxDisplayEnterVT(VT_FUNC_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++      SCRN_INFO_PTR(arg);
+       return xf86SetDesiredModes(pScrn);
+ }
+ void
+-imxDisplayLeaveVT(int scrnIndex, int flags)
++imxDisplayLeaveVT(VT_FUNC_ARGS_DECL)
+ {
+ }
+diff --git a/src/imx_display.h b/src/imx_display.h
+index 4a5d5aa..3a3d43a 100644
+--- a/src/imx_display.h
++++ b/src/imx_display.h
+@@ -59,16 +59,16 @@ imxDisplayValidMode(int scrnIndex, DisplayModePtr mode,
+                       Bool verbose, int flags);
+ extern Bool
+-imxDisplaySwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
++imxDisplaySwitchMode(SWITCH_MODE_ARGS_DECL);
+ extern void
+-imxDisplayAdjustFrame(int scrnIndex, int x, int y, int flags);
++imxDisplayAdjustFrame(ADJUST_FRAME_ARGS_DECL);
+ extern Bool
+-imxDisplayEnterVT(int scrnIndex, int flags);
++imxDisplayEnterVT(VT_FUNC_ARGS_DECL);
+ extern void
+-imxDisplayLeaveVT(int scrnIndex, int flags);
++imxDisplayLeaveVT(VT_FUNC_ARGS_DECL);
+ extern Bool
+ imxDisplayChangeFrameBufferRotateEPDC(int scrnIndex, int fbRotate);
+diff --git a/src/imx_driver.c b/src/imx_driver.c
+index 178e36e..f4b3e38 100644
+--- a/src/imx_driver.c
++++ b/src/imx_driver.c
+@@ -46,6 +46,8 @@
+ #include "fb.h"
+ #include "fbdevhw.h"
++#include "compat-api.h"
++
+ #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
+ #include "xf86Resources.h"
+ #include "xf86RAC.h"
+@@ -435,17 +437,17 @@ errorPreInit:
+ }
+ static void
+-imxFreeScreen(int scrnIndex, int flags)
++imxFreeScreen(FREE_SCREEN_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++      SCRN_INFO_PTR(arg);
+       imxFreeRec(pScrn);
+ }
+ static Bool
+-imxCloseScreen(int scrnIndex, ScreenPtr pScreen)
++imxCloseScreen(CLOSE_SCREEN_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++      CLOSE_SCREEN_DECL_ScrnInfoPtr;
+       ImxPtr fPtr = IMXPTR(pScrn);
+       fbdevHWRestore(pScrn);
+@@ -453,7 +455,7 @@ imxCloseScreen(int scrnIndex, ScreenPtr pScreen)
+       pScrn->vtSema = FALSE;
+       pScreen->CloseScreen = fPtr->saveCloseScreen;
+-      return (*pScreen->CloseScreen)(scrnIndex, pScreen);
++      return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
+ }
+ static int
+@@ -488,9 +490,9 @@ LCM(a, b)
+ }
+ static Bool
+-imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
++imxScreenInit(SCREEN_INIT_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       ImxPtr fPtr = IMXPTR(pScrn);
+       VisualPtr visual;
+       int init_picture = 0;
+@@ -514,7 +516,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       /* Map frame buffer memory */
+       fPtr->fbMemoryBase = fbdevHWMapVidmem(pScrn);
+       if (NULL == fPtr->fbMemoryBase) {
+-              xf86DrvMsg(scrnIndex,X_ERROR,"mapping of video memory"
++              xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mapping of video memory"
+                          " failed\n");
+               return FALSE;
+       }
+@@ -558,7 +560,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       const int fbOffsetScreen2 =
+               IMX_ALIGN(fbMaxScreenSize, fbMaxAlignOffset);
+       fPtr->fbMemoryScreenReserve = fbMaxScreenSize;
+-      xf86DrvMsg(scrnIndex, X_INFO,
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+               "reserve %d bytes of frame buffer for screen\n",
+               fPtr->fbMemoryScreenReserve);
+       fPtr->fbMemoryStart2 = NULL;
+@@ -568,12 +570,12 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+               fPtr->fbMemoryScreenReserve += fbOffsetScreen2;
+-              xf86DrvMsg(scrnIndex, X_INFO,
++              xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                       "reserve same number of bytes for XRandR rotated screen at offset %d\n",
+                       fbOffsetScreen2);
+       }
+-      if (!imxDisplayStartScreenInit(scrnIndex, pScreen)) {
++      if (!imxDisplayStartScreenInit(pScrn->scrnIndex, pScreen)) {
+               return FALSE;
+       }
+@@ -582,7 +584,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       miClearVisualTypes();
+       if (pScrn->bitsPerPixel > 8) {
+               if (!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits, TrueColor)) {
+-                      xf86DrvMsg(scrnIndex,X_ERROR,"visual type setup failed"
++                      xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"visual type setup failed"
+                                  " for %d bits per pixel [1]\n",
+                                  pScrn->bitsPerPixel);
+                       return FALSE;
+@@ -591,14 +593,14 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+               if (!miSetVisualTypes(pScrn->depth,
+                                     miGetDefaultVisualMask(pScrn->depth),
+                                     pScrn->rgbBits, pScrn->defaultVisual)) {
+-                      xf86DrvMsg(scrnIndex,X_ERROR,"visual type setup failed"
++                      xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"visual type setup failed"
+                                  " for %d bits per pixel [2]\n",
+                                  pScrn->bitsPerPixel);
+                       return FALSE;
+               }
+       }
+       if (!miSetPixmapDepths()) {
+-        xf86DrvMsg(scrnIndex,X_ERROR,"pixmap depth setup failed\n");
++        xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"pixmap depth setup failed\n");
+         return FALSE;
+       }
+@@ -607,10 +609,10 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+               has a padding which is independent from the depth (controlfb) */
+       pScrn->displayWidth = fbdevHWGetLineLength(pScrn) /
+                             (pScrn->bitsPerPixel / 8);
+-      xf86DrvMsg(scrnIndex, X_INFO, "displayWidth = %d\n", pScrn->displayWidth);
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "displayWidth = %d\n", pScrn->displayWidth);
+       if (pScrn->displayWidth != pScrn->virtualX) {
+-              xf86DrvMsg(scrnIndex, X_INFO,
++              xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                          "Pitch updated to %d after ModeInit\n",
+                          pScrn->displayWidth);
+       }
+@@ -633,7 +635,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+                       init_picture = 1;
+                       break;
+               default:
+-                      xf86DrvMsg(scrnIndex, X_ERROR,
++                      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                  "internal error: invalid number of bits per"
+                                  " pixel (%d) encountered in"
+                                  " imxScreenInit()\n", pScrn->bitsPerPixel);
+@@ -644,7 +646,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       case FBDEVHW_INTERLEAVED_PLANES:
+               /* This should never happen ...
+               * we should check for this much much earlier ... */
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: interleaved planes are not yet "
+                          "supported by the imx driver\n");
+               ret = FALSE;
+@@ -652,20 +654,20 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       case FBDEVHW_TEXT:
+               /* This should never happen ...
+               * we should check for this much much earlier ... */
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: text mode is not supported by the "
+                          "imx driver\n");
+               ret = FALSE;
+               break;
+       case FBDEVHW_VGA_PLANES:
+               /* Not supported yet */
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: EGA/VGA Planes are not yet "
+                          "supported by the imx driver\n");
+               ret = FALSE;
+               break;
+       default:
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: unrecognised hardware type (%d) "
+                          "encountered in imxScreenInit()\n", type);
+               ret = FALSE;
+@@ -699,7 +701,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       /* INIT ACCELERATION BEFORE INIT FOR BACKING STORE & SOFTWARE CURSOR */ 
+       if (fPtr->useAccel) {
+-              if (!imxExaZ160Setup(scrnIndex, pScreen)) {
++              if (!imxExaZ160Setup(pScrn->scrnIndex, pScreen)) {
+                       fPtr->useAccel = FALSE;
+               }
+@@ -731,29 +733,29 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       /* XXX It would be simpler to use miCreateDefColormap() in all cases. */
+       case FBDEVHW_PACKED_PIXELS:
+               if (!miCreateDefColormap(pScreen)) {
+-                      xf86DrvMsg(scrnIndex, X_ERROR,
++                      xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                    "internal error: miCreateDefColormap failed "
+                                  "in imxScreenInit()\n");
+                       return FALSE;
+               }
+               break;
+       case FBDEVHW_INTERLEAVED_PLANES:
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: interleaved planes are not yet "
+                          "supported by the imx driver\n");
+               return FALSE;
+       case FBDEVHW_TEXT:
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: text mode is not supported by "
+                          "the imx driver\n");
+               return FALSE;
+       case FBDEVHW_VGA_PLANES:
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: EGA/VGA planes are not yet "
+                          "supported by the imx driver\n");
+               return FALSE;
+       default:
+-              xf86DrvMsg(scrnIndex, X_ERROR,
++              xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                          "internal error: unrecognised imx hardware type "
+                          "(%d) encountered in imxScreenInit()\n", type);
+               return FALSE;
+@@ -782,7 +784,7 @@ imxScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+       }
+ #endif
+-      if (!imxDisplayFinishScreenInit(scrnIndex, pScreen)) {
++      if (!imxDisplayFinishScreenInit(pScrn->scrnIndex, pScreen)) {
+               return FALSE;
+       }
+@@ -810,7 +812,7 @@ IMXGetPixmapProperties(
+       }
+       /* Access screen associated with this pixmap. */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Check if the screen associated with this pixmap has IMX driver. */
+       if (0 != strcmp(IMX_DRIVER_NAME, pScrn->driverName)) {
+diff --git a/src/imx_exa_offscreen.c b/src/imx_exa_offscreen.c
+index 3a5c24d..0fbe2fc 100644
+--- a/src/imx_exa_offscreen.c
++++ b/src/imx_exa_offscreen.c
+@@ -79,7 +79,7 @@ static void
+ imxExaOffscreenValidate (ScreenPtr pScreen)
+ {
+     /* Access the driver specific data. */
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+     ExaOffscreenArea *prev = 0, *area;
+@@ -135,7 +135,7 @@ imxExaOffscreenMerge (ImxExaPtr imxExaPtr, ExaOffscreenArea *area)
+ ExaOffscreenArea *
+ imxExaOffscreenFree (ScreenPtr pScreen, ExaOffscreenArea *area)
+ {
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+     ExaOffscreenArea  *next = area->next;
+@@ -281,7 +281,7 @@ imxExaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
+                    pointer privData)
+ {
+     ExaOffscreenArea *area;
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+     int real_size = 0, largest_avail = 0;
+@@ -418,7 +418,7 @@ imxExaOffscreenSwapIn (ScreenPtr pScreen)
+ Bool
+ imxExaOffscreenInit (ScreenPtr pScreen)
+ {
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+     ExaOffscreenArea *area;
+@@ -453,7 +453,7 @@ imxExaOffscreenInit (ScreenPtr pScreen)
+ void
+ imxExaOffscreenFini (ScreenPtr pScreen)
+ {
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+     ExaOffscreenArea *area;
+@@ -472,7 +472,7 @@ imxExaOffscreenFini (ScreenPtr pScreen)
+ void
+ imxExaOffscreenSwapOut (ScreenPtr pScreen)
+ {
+-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+     ImxPtr imxPtr = IMXPTR(pScrn);
+     ImxExaPtr imxExaPtr = IMXEXAPTR(imxPtr);
+diff --git a/src/imx_exa_z160.c b/src/imx_exa_z160.c
+index fb718e0..3d0bc96 100644
+--- a/src/imx_exa_z160.c
++++ b/src/imx_exa_z160.c
+@@ -32,6 +32,7 @@
+ #include <errno.h>
+ #include <fcntl.h>
++#include "compat-api.h"
+ /* Set if handles pixmap allocation and migration, i.e, EXA_HANDLES_PIXMAPS */
+ #define       IMX_EXA_ENABLE_HANDLES_PIXMAPS  \
+@@ -299,7 +300,7 @@ imxExaZ160GetPixmapAddress(PixmapPtr pPixmap)
+       return fPixmapPtr->ptr;
+ #else
+       /* Access screen associated with this pixmap. */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -344,7 +345,7 @@ imxExaZ160GetPixmapProperties(
+ #else
+       /* Access screen associated with this pixmap. */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Make sure pixmap is in framebuffer */
+       if (!exaDrawableIsOffscreen(&(pPixmap->drawable))) {
+@@ -856,7 +857,7 @@ imxExaZ160SyncIfBusyPixmap(PixmapPtr pPixmap)
+ {
+       /* Access screen associated with this pixmap. */
+       ScreenPtr pScreen = pPixmap->drawable.pScreen;
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       /* Access driver specific data for screen. */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -924,7 +925,7 @@ imxExaZ160CreatePixmap2(ScreenPtr pScreen, int width, int height,
+       }
+       /* Access the driver specific data. */
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       ImxPtr imxPtr = IMXPTR(pScrn);
+       ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
+       
+@@ -1028,7 +1029,7 @@ imxExaZ160DestroyPixmap(ScreenPtr pScreen, void *driverPriv)
+       ImxExaPixmapPtr fPixmapPtr = (ImxExaPixmapPtr)driverPriv;
+       /* Access the driver specific data. */
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       ImxPtr imxPtr = IMXPTR(pScrn);
+       ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
+@@ -1068,7 +1069,7 @@ imxExaZ160ModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
+       }
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1194,7 +1195,7 @@ imxExaZ160TrackBusyPixmap(ImxExaZ160Ptr fPtr, PixmapPtr pPixmap)
+ static void
+ imxExaZ160WaitMarker(ScreenPtr pScreen, int marker)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       /* Access driver specific data associated with the screen. */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1249,7 +1250,7 @@ imxExaZ160PrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
+       }
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1352,7 +1353,7 @@ static void
+ imxExaZ160Solid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
+ {
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1423,7 +1424,7 @@ static void
+ imxExaZ160DoneSolid(PixmapPtr pPixmap)
+ {
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1485,7 +1486,7 @@ imxExaZ160PrepareCopy(
+       }
+       /* Access the screen associated with this pixmap. */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1599,7 +1600,7 @@ static void
+ imxExaZ160Copy(PixmapPtr pPixmapDst, int srcX, int srcY, int dstX, int dstY, int width, int height)
+ {
+       /* Access screen associated with dst pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1661,7 +1662,7 @@ static void
+ imxExaZ160DoneCopy(PixmapPtr pPixmapDst)
+ {
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -1770,7 +1771,7 @@ imxExaZ160CheckComposite(int op, PicturePtr pPictureSrc, PicturePtr pPictureMask
+       }
+       /* Access screen associated with dst pixmap (same screen as for src pixmap). */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Check the number of entities, and fail if it isn't one. */
+       if (pScrn->numEntities != 1) {
+@@ -1987,7 +1988,7 @@ imxExaZ160PrepareComposite(
+ {
+       /* Access screen associated with dst pixmap. */
+       /* Should be same screen as for src pixmap. */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* NOTE - many preconditions already verified in CheckComposite. */
+@@ -2196,7 +2197,7 @@ imxExaZ160Composite(
+       int height)
+ {
+       /* Access screen associated with dst pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -2275,7 +2276,7 @@ static void
+ imxExaZ160DoneComposite(PixmapPtr pPixmapDst)
+ {
+       /* Access screen associated with this pixmap */
+-      ScrnInfoPtr pScrn = xf86Screens[pPixmapDst->drawable.pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmapDst->drawable.pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -2323,7 +2324,7 @@ imxExaZ160UploadToScreen(
+       /* Access screen associated with this pixmap */
+       ScreenPtr pScreen = pPixmapDst->drawable.pScreen;
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -2381,7 +2382,7 @@ imxExaZ160DownloadFromScreen(
+       /* Access screen associated with this pixmap */
+       ScreenPtr pScreen = pPixmapSrc->drawable.pScreen;
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       /* Access driver specific data */
+       ImxPtr imxPtr = IMXPTR(pScrn);
+@@ -2412,9 +2413,9 @@ imxExaZ160DownloadFromScreen(
+ }
+ Bool
+-imxExaZ160CloseScreen(int scrnIndex, ScreenPtr pScreen)
++imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS_DECL)
+ {
+-      ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
++      CLOSE_SCREEN_DECL_ScrnInfoPtr;
+       ImxPtr imxPtr = IMXPTR(pScrn);
+       ImxExaZ160Ptr fPtr = IMXEXAZ160PTR(imxPtr);
+@@ -2504,7 +2505,7 @@ imxExaZ160CloseScreen(int scrnIndex, ScreenPtr pScreen)
+       /* Install our CloseScreen function so that it gets called. */
+       if (NULL != pScreen->CloseScreen) {
+-              return (*pScreen->CloseScreen)(scrnIndex, pScreen);
++              return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);
+       }
+       return TRUE;
+@@ -2514,7 +2515,7 @@ Bool
+ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
+ {
+       /* Access the screen info and then private data structures. */
+-      ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
++      ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+       ImxPtr imxPtr = IMXPTR(pScrn);
+       /* Private data structure must not already be in use. */
+@@ -2582,7 +2583,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
+               xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                       "Initialize Z160 interfaces failed.\n");
+-              imxExaZ160CloseScreen(scrnIndex, pScreen);
++              imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
+               return FALSE;
+       }
+@@ -2592,7 +2593,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
+               xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                       "Allocate EXA driver structure.\n");
+-              imxExaZ160CloseScreen(scrnIndex, pScreen);
++              imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
+               return FALSE;
+       }
+@@ -2657,7 +2658,7 @@ imxExaZ160Setup(int scrnIndex, ScreenPtr pScreen)
+       if (!exaDriverInit(pScreen, exaDriverPtr)) {
+               xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "EXA initialization failed.\n");
+-              imxExaZ160CloseScreen(scrnIndex, pScreen);
++              imxExaZ160CloseScreen(CLOSE_SCREEN_ARGS);
+               return FALSE;
+       }
+       fPtr->imxExaRec.exaDriverPtr = exaDriverPtr;
+diff --git a/src/imx_xv_ipu.c b/src/imx_xv_ipu.c
+index a517742..fc8a827 100644
+--- a/src/imx_xv_ipu.c
++++ b/src/imx_xv_ipu.c
+@@ -398,7 +398,7 @@ xf86XVFillKeyHelper1 (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
+       xRectangle *rects;
+       GCPtr gc;
+-      if(!xf86Screens[pScreen->myNum]->vtSema) return;
++      if(!xf86ScreenToScrn(pScreen)->vtSema) return;
+       gc = GetScratchGC(root->depth, pScreen);
+       pval[0] = key;
+@@ -771,7 +771,7 @@ MXXVInitializeAdaptor
+       XF86VideoAdaptorPtr **pppAdaptor
+ )
+ {
+-      ScreenPtr           pScreen    = screenInfo.screens[pScreenInfo->scrnIndex];
++      ScreenPtr           pScreen    = xf86ScrnToScreen(pScreenInfo);
+       XF86VideoAdaptorPtr *ppAdaptor = NULL;
+       IMXPtr fPtr = IMXPTR(pScreenInfo);
+       int                 nAdaptor;
+-- 
+1.7.10.4
+