configure.ac                                     |   10 
 debian/changelog                                 |   21 +-
 debian/patches/adding-platform-bus-support.patch |  141 -------------
 debian/patches/series                            |    2 
 src/driver.c                                     |  240 +++++++++++++++++++----
 src/drmmode_display.c                            |  118 +++++++++++
 src/drmmode_display.h                            |   27 ++
 7 files changed, 368 insertions(+), 191 deletions(-)

New commits:
commit 1f031c695518db92ba457663a6d5ac7f387a9642
Author: Timo Aaltonen <tjaal...@ubuntu.com>
Date:   Thu Sep 13 10:24:48 2012 +0300

    release to quantal

diff --git a/debian/changelog b/debian/changelog
index 3236b8a..b9a95d6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,9 @@
-xserver-xorg-video-modesetting (0.5.0-0ubuntu1) UNRELEASED; urgency=low
+xserver-xorg-video-modesetting (0.5.0-0ubuntu1) quantal; urgency=low
 
   * Sync from unreleased debian git.
     - Removed adding-platform-bus-support.patch, included upstream.
 
- -- Timo Aaltonen <tjaal...@ubuntu.com>  Thu, 13 Sep 2012 10:23:33 +0300
+ -- Timo Aaltonen <tjaal...@ubuntu.com>  Thu, 13 Sep 2012 10:24:26 +0300
 
 xserver-xorg-video-modesetting (0.5.0-1) UNRELEASED; urgency=low
 

commit 89bb7812b0da8646bec2cfe4568a44aaefc0d013
Author: Timo Aaltonen <tjaal...@ubuntu.com>
Date:   Thu Sep 13 10:24:20 2012 +0300

    remove the upstream patch

diff --git a/debian/changelog b/debian/changelog
index 34383dd..3236b8a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xserver-xorg-video-modesetting (0.5.0-0ubuntu1) UNRELEASED; urgency=low
+
+  * Sync from unreleased debian git.
+    - Removed adding-platform-bus-support.patch, included upstream.
+
+ -- Timo Aaltonen <tjaal...@ubuntu.com>  Thu, 13 Sep 2012 10:23:33 +0300
+
 xserver-xorg-video-modesetting (0.5.0-1) UNRELEASED; urgency=low
 
   * New upstream release.
diff --git a/debian/patches/adding-platform-bus-support.patch 
b/debian/patches/adding-platform-bus-support.patch
deleted file mode 100644
index 72b4019..0000000
--- a/debian/patches/adding-platform-bus-support.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From: Dave Airlie <airl...@redhat.com>
-Subject: modesetting: add platform bus support
-Origin: upstream, 
http://cgit.freedesktop.org/xorg/driver/xf86-video-modesetting/commit/?id=65054df
-Bug-Ubuntu: http://bugs.launchpad.net/bugs/1041727
-
-diff --git a/src/driver.c b/src/driver.c
-index 8c3f4a4..86be277 100644
---- a/src/driver.c
-+++ b/src/driver.c
-@@ -52,6 +52,9 @@
- #include "xf86xv.h"
- #include <X11/extensions/Xv.h>
- #include <xorg-server.h>
-+#ifdef XSERVER_PLATFORM_BUS
-+#include "xf86platformBus.h"
-+#endif
- #if XSERVER_LIBPCIACCESS
- #include <pciaccess.h>
- #endif
-@@ -88,6 +91,12 @@ static const struct pci_id_match ms_device_match[] = {
- };
- #endif
- 
-+#ifdef XSERVER_PLATFORM_BUS
-+static Bool ms_platform_probe(DriverPtr driver,
-+                          int entity_num, int flags, struct 
xf86_platform_device *device,
-+                        intptr_t match_data);
-+#endif
-+
- _X_EXPORT DriverRec modesetting = {
-     1,
-     "modesetting",
-@@ -99,6 +108,9 @@ _X_EXPORT DriverRec modesetting = {
-     NULL,
-     ms_device_match,
-     ms_pci_probe,
-+#ifdef XSERVER_PLATFORM_BUS
-+    ms_platform_probe,
-+#endif
- };
- 
- static SymTabRec Chipsets[] = {
-@@ -288,6 +300,40 @@ ms_pci_probe(DriverPtr driver,
- }
- #endif
- 
-+#ifdef XSERVER_PLATFORM_BUS
-+static Bool
-+ms_platform_probe(DriverPtr driver,
-+              int entity_num, int flags, struct xf86_platform_device *dev, 
intptr_t match_data)
-+{
-+    ScrnInfoPtr scrn = NULL;
-+    char *path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH);
-+    int scr_flags = 0;
-+
-+    if (flags & PLATFORM_PROBE_GPU_SCREEN)
-+            scr_flags = XF86_ALLOCATE_GPU_SCREEN;
-+
-+    if (probe_hw(path)) {
-+        scrn = xf86AllocateScreen(driver, scr_flags);
-+        xf86AddEntityToScreen(scrn, entity_num);
-+
-+        scrn->driverName = "modesetting";
-+        scrn->name = "modesetting";
-+        scrn->PreInit = PreInit;
-+        scrn->ScreenInit = ScreenInit;
-+        scrn->SwitchMode = SwitchMode;
-+        scrn->AdjustFrame = AdjustFrame;
-+        scrn->EnterVT = EnterVT;
-+        scrn->LeaveVT = LeaveVT;
-+        scrn->FreeScreen = FreeScreen;
-+        scrn->ValidMode = ValidMode;
-+        xf86DrvMsg(scrn->scrnIndex, X_INFO,
-+                   "using drv %s\n", path ? path : "default device");
-+    }
-+
-+    return scrn != NULL;
-+}
-+#endif
-+
- static Bool
- Probe(DriverPtr drv, int flags)
- {
-@@ -431,7 +477,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
-     rgb defaultWeight = { 0, 0, 0 };
-     EntityInfoPtr pEnt;
-     EntPtr msEnt = NULL;
--    char *BusID, *devicename;
-+    char *BusID = NULL, *devicename;
-     Bool prefer_shadow = TRUE;
-     uint64_t value = 0;
-     int ret;
-@@ -477,24 +523,32 @@ PreInit(ScrnInfoPtr pScrn, int flags)
-     pScrn->progClock = TRUE;
-     pScrn->rgbBits = 8;
- 
--    ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
--    if (ms->PciInfo) {
--       BusID = malloc(64);
--       sprintf(BusID, "PCI:%d:%d:%d",
-+#if XSERVER_PLATFORM_BUS
-+    if (pEnt->location.type == BUS_PLATFORM) {
-+            char *path = 
xf86_get_platform_device_attrib(pEnt->location.id.plat, ODEV_ATTRIB_PATH);
-+            ms->fd = open_hw(path);
-+    }
-+    else 
-+#endif
-+    if (pEnt->location.type == BUS_PCI) {
-+        ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
-+        if (ms->PciInfo) {
-+            BusID = malloc(64);
-+            sprintf(BusID, "PCI:%d:%d:%d",
- #if XSERVER_LIBPCIACCESS
--              ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
--              ms->PciInfo->dev, ms->PciInfo->func
-+                    ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
-+                    ms->PciInfo->dev, ms->PciInfo->func
- #else
--              ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
--              ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
--              ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
-+                    ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
-+                    ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
-+                    ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
- #endif
--          );
--
--       ms->fd = drmOpen(NULL, BusID);
-+                );
-+        }
-+        ms->fd = drmOpen(NULL, BusID);
-     } else {
--       devicename = xf86FindOptionValue(ms->pEnt->device->options, "kmsdev");
--       ms->fd = open_hw(devicename);
-+        devicename = xf86FindOptionValue(ms->pEnt->device->options, "kmsdev");
-+        ms->fd = open_hw(devicename);
-     }
-     if (ms->fd < 0)
-       return FALSE;
--- 
-1.7.9.5
diff --git a/debian/patches/series b/debian/patches/series
index d696b3b..a82d1b4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1 @@
-adding-platform-bus-support.patch
+#placeholder

commit e99c42dcc03b7837f8442d75d2d27b9986354bbb
Author: Maarten Lankhorst <maarten.lankho...@canonical.com>
Date:   Thu Sep 13 09:03:31 2012 +0200

    New upstream release

diff --git a/debian/changelog b/debian/changelog
index 5c6ff0e..01008ae 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-xserver-xorg-video-modesetting (0.4.0-1) UNRELEASED; urgency=low
+xserver-xorg-video-modesetting (0.5.0-1) UNRELEASED; urgency=low
 
   * New upstream release.
   * Require x-server 1.13rc1

commit e00ef802391af73310c0ee0ee78254228bc29075
Author: Maarten Lankhorst <maarten.lankho...@canonical.com>
Date:   Thu Sep 13 08:45:14 2012 +0200

    bump version to 0.5.0

diff --git a/configure.ac b/configure.ac
index e1b3727..b6815c4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-modesetting],
-        [0.4.0],
+        [0.5.0],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-video-modesetting])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 2b9531d969e7c106391b509a64c16257a5109fed
Author: Adam Jackson <a...@redhat.com>
Date:   Thu Jul 19 22:15:10 2012 +0000

    Implement ->driverFunc
    
    Copied from fbdev, makes it so we can run without iopl.
    
    Signed-off-by: Adam Jackson <a...@redhat.com>

diff --git a/src/driver.c b/src/driver.c
index 371c171..38a1c09 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -79,6 +79,8 @@ static Bool Probe(DriverPtr drv, int flags);
 static Bool ms_pci_probe(DriverPtr driver,
                         int entity_num, struct pci_device *device,
                         intptr_t match_data);
+static Bool ms_driver_func(ScrnInfoPtr scrn, xorgDriverFuncOp op,
+                          void *data);
 
 #ifdef XSERVER_LIBPCIACCESS
 static const struct pci_id_match ms_device_match[] = {
@@ -105,7 +107,7 @@ _X_EXPORT DriverRec modesetting = {
     AvailableOptions,
     NULL,
     0,
-    NULL,
+    ms_driver_func,
     ms_device_match,
     ms_pci_probe,
 #ifdef XSERVER_PLATFORM_BUS
@@ -259,6 +261,21 @@ AvailableOptions(int chipid, int busid)
     return Options;
 }
 
+static Bool
+ms_driver_func(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
+{
+    xorgHWFlags *flag;
+    
+    switch (op) {
+       case GET_REQUIRED_HW_INTERFACES:
+           flag = (CARD32 *)data;
+           (*flag) = 0;
+           return TRUE;
+       default:
+           return FALSE;
+    }
+}
+
 #if XSERVER_LIBPCIACCESS
 static Bool
 ms_pci_probe(DriverPtr driver,

commit 2802071fa9d421a2998d4971671b5c4275d3d435
Author: Dave Airlie <airl...@redhat.com>
Date:   Thu Jul 19 14:12:59 2012 +1000

    modesetting: add output slave support.
    
    This allows the driver to operate as an output slave.
    
    It adds scan out pixmap, and the capability
    checks to make sure they available.
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>

diff --git a/configure.ac b/configure.ac
index 45a1b9f..e1b3727 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,6 +82,14 @@ if test x"$udev" = xyes; then
         AC_DEFINE(HAVE_UDEV,1,[Enable udev-based monitor hotplug detection])
 fi
 
+SAVE_CFLAGS=$CFLAGS
+SAVE_LIBS=$LIBS
+CFLAGS=$DRM_CFLAGS
+LIBS=$DRM_LIBS
+AC_CHECK_FUNCS([drmPrimeFDToHandle])
+CFLAGS=$SAVE_CFLAGS
+LIBS=$SAVE_LIBS
+
 DRIVER_NAME=modesetting
 AC_SUBST([DRIVER_NAME])
 AC_SUBST([moduledir])
diff --git a/src/driver.c b/src/driver.c
index 86be277..371c171 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -401,21 +401,20 @@ GetRec(ScrnInfoPtr pScrn)
     return TRUE;
 }
 
-static void dispatch_dirty(ScreenPtr pScreen)
+static int dispatch_dirty_region(ScrnInfoPtr scrn,
+                                PixmapPtr pixmap,
+                                DamagePtr damage,
+                                int fb_id)
 {
-    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
     modesettingPtr ms = modesettingPTR(scrn);
-    RegionPtr dirty = DamageRegion(ms->damage);
+    RegionPtr dirty = DamageRegion(damage);
     unsigned num_cliprects = REGION_NUM_RECTS(dirty);
 
     if (num_cliprects) {
-       drmModeClip *clip = malloc(num_cliprects * sizeof(drmModeClip));
+       drmModeClip *clip = alloca(num_cliprects * sizeof(drmModeClip));
        BoxPtr rect = REGION_RECTS(dirty);
        int i, ret;
-       
-       if (!clip)
-               return;
-
+           
        /* XXX no need for copy? */
        for (i = 0; i < num_cliprects; i++, rect++) {
            clip[i].x1 = rect->x1;
@@ -425,25 +424,71 @@ static void dispatch_dirty(ScreenPtr pScreen)
        }
 
        /* TODO query connector property to see if this is needed */
-       ret = drmModeDirtyFB(ms->fd, ms->drmmode.fb_id, clip, num_cliprects);
-       free(clip);
+       ret = drmModeDirtyFB(ms->fd, fb_id, clip, num_cliprects);
+       DamageEmpty(damage);
        if (ret) {
-           if (ret == -EINVAL || ret == -ENOSYS) {
-               ms->dirty_enabled = FALSE;
-               DamageUnregister(&pScreen->GetScreenPixmap(pScreen)->drawable, 
ms->damage);
-               DamageDestroy(ms->damage);
-               ms->damage = NULL;
-               xf86DrvMsg(scrn->scrnIndex, X_INFO, "Disabling kernel dirty 
updates, not required.\n");
-               return;
-           } else
-               ErrorF("%s: failed to send dirty (%i, %s)\n",
-                      __func__, ret, strerror(-ret));
+           if (ret == -EINVAL)
+               return ret;
        }
-       
-       DamageEmpty(ms->damage);
+    }
+    return 0;
+}
+
+static void dispatch_dirty(ScreenPtr pScreen)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+    PixmapPtr pixmap = pScreen->GetScreenPixmap(pScreen);
+    int fb_id = ms->drmmode.fb_id;
+    int ret;
+
+    ret = dispatch_dirty_region(scrn, pixmap, ms->damage, fb_id);
+    if (ret == -EINVAL || ret == -ENOSYS) {
+       ms->dirty_enabled = FALSE;
+       DamageUnregister(&pScreen->GetScreenPixmap(pScreen)->drawable, 
ms->damage);
+       DamageDestroy(ms->damage);
+       ms->damage = NULL;
+       xf86DrvMsg(scrn->scrnIndex, X_INFO, "Disabling kernel dirty updates, 
not required.\n");
+       return;
+    }
+}
+
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+static void dispatch_dirty_crtc(ScrnInfoPtr scrn, xf86CrtcPtr crtc)
+{
+    modesettingPtr ms = modesettingPTR(scrn);
+    PixmapPtr pixmap = crtc->randr_crtc->scanout_pixmap;
+    msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, pixmap);
+    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+    DamagePtr damage = drmmode_crtc->slave_damage;
+    int fb_id = ppriv->fb_id;
+    int ret;
+
+    ret = dispatch_dirty_region(scrn, pixmap, damage, fb_id);
+    if (ret) {
+
     }
 }
 
+static void dispatch_slave_dirty(ScreenPtr pScreen)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int c;
+
+    for (c = 0; c < xf86_config->num_crtc; c++) {
+       xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+       if (!crtc->randr_crtc)
+           continue;
+       if (!crtc->randr_crtc->scanout_pixmap)
+           continue;
+
+       dispatch_dirty_crtc(scrn, crtc);
+    }
+}
+#endif
+
 static void msBlockHandler(BLOCKHANDLER_ARGS_DECL)
 {
     SCREEN_PTR(arg);
@@ -452,8 +497,13 @@ static void msBlockHandler(BLOCKHANDLER_ARGS_DECL)
     pScreen->BlockHandler = ms->BlockHandler;
     pScreen->BlockHandler(BLOCKHANDLER_ARGS);
     pScreen->BlockHandler = msBlockHandler;
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+    if (pScreen->isGPU)
+        dispatch_slave_dirty(pScreen);
+    else
+#endif
     if (ms->dirty_enabled)
-       dispatch_dirty(pScreen);
+        dispatch_dirty(pScreen);
 }
 
 static void
@@ -555,6 +605,16 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 
     ms->drmmode.fd = ms->fd;
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+    pScrn->capabilities = 0;
+#ifdef DRM_CAP_PRIME
+    ret = drmGetCap(ms->fd, DRM_CAP_PRIME, &value);
+    if (ret == 0) {
+        if (value & DRM_PRIME_CAP_IMPORT)
+            pScrn->capabilities |= RR_Capability_SinkOutput;
+    }
+#endif
+#endif
     drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp);
     if (defaultdepth == 24 && defaultbpp == 24)
            bppflags = Support24bppFb;
@@ -719,6 +779,25 @@ msShadowInit(ScreenPtr pScreen)
     return TRUE;
 }
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+static Bool
+msSetSharedPixmapBacking(PixmapPtr ppix, void *fd_handle)
+{
+    ScreenPtr screen = ppix->drawable.pScreen;
+    ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+    modesettingPtr ms = modesettingPTR(scrn);
+    Bool ret;
+    int size = ppix->devKind * ppix->drawable.height;
+    int ihandle = (int)(long)fd_handle;
+
+    ret = drmmode_SetSlaveBO(ppix, &ms->drmmode, ihandle, ppix->devKind, size);
+    if (ret == FALSE)
+           return ret;
+
+    return TRUE;
+}
+#endif
+
 static Bool
 ScreenInit(SCREEN_INIT_ARGS_DECL)
 {
@@ -757,6 +836,13 @@ ScreenInit(SCREEN_INIT_ARGS_DECL)
     if (!miSetPixmapDepths())
        return FALSE;
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+    if (!dixRegisterScreenSpecificPrivateKey(pScreen, 
&ms->drmmode.pixmapPrivateKeyRec,
+        PRIVATE_PIXMAP, sizeof(msPixmapPrivRec))) { 
+       return FALSE;
+    }
+#endif
+
     pScrn->memPhysBase = 0;
     pScrn->fbOffset = 0;
 
@@ -816,6 +902,10 @@ ScreenInit(SCREEN_INIT_ARGS_DECL)
     ms->BlockHandler = pScreen->BlockHandler;
     pScreen->BlockHandler = msBlockHandler;
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+    pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking;
+#endif
+
     if (!xf86CrtcScreenInit(pScreen))
        return FALSE;
 
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 9ee553e..5e38265 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -138,6 +138,43 @@ static int dumb_bo_destroy(int fd, struct dumb_bo *bo)
        return 0;
 }
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+static struct dumb_bo *dumb_get_bo_from_handle(int fd, int handle, int pitch, 
int size)
+{
+       struct dumb_bo *bo;
+       int ret;
+
+       bo = calloc(1, sizeof(*bo));
+       if (!bo)
+               return NULL;
+
+       ret = drmPrimeFDToHandle(fd, handle, &bo->handle);
+       if (ret) {
+               free(bo);
+               return NULL;
+       }
+       bo->pitch = pitch;
+       bo->size = size;
+       return bo;
+}
+#endif
+
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+Bool drmmode_SetSlaveBO(PixmapPtr ppix,
+                       drmmode_ptr drmmode, 
+                       int fd_handle, int pitch, int size)
+{
+       msPixmapPrivPtr ppriv = msGetPixmapPriv(drmmode, ppix);
+
+       ppriv->backing_bo = dumb_get_bo_from_handle(drmmode->fd, fd_handle, 
pitch, size);
+       if (!ppriv->backing_bo)
+               return FALSE;
+
+       close(fd_handle);
+       return TRUE;
+}
+#endif
+
 static void
 drmmode_ConvertFromKMode(ScrnInfoPtr   scrn,
                     drmModeModeInfo *kmode,
@@ -274,7 +311,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
        int output_count = 0;
        Bool ret = TRUE;
        int i;
-       int fb_id;
+       uint32_t fb_id;
        drmModeModeInfo kmode;
        int height;
 
@@ -338,6 +375,13 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                drmmode_ConvertToKMode(crtc->scrn, &kmode, mode);
 
                fb_id = drmmode->fb_id;
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+               if (crtc->randr_crtc->scanout_pixmap) {
+                       msPixmapPrivPtr ppriv = msGetPixmapPriv(drmmode, 
crtc->randr_crtc->scanout_pixmap);
+                       fb_id = ppriv->fb_id;
+                       x = y = 0;
+               } else 
+#endif
                if (drmmode_crtc->rotate_fb_id) {
                        fb_id = drmmode_crtc->rotate_fb_id;
                        x = y = 0;
@@ -455,6 +499,54 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, 
uint16_t *green,
                            size, red, green, blue);
 }
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+static Bool
+drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
+{
+       drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+       drmmode_ptr drmmode = drmmode_crtc->drmmode;
+       msPixmapPrivPtr ppriv;
+       void *ptr;
+
+       if (!ppix) {
+               if (crtc->randr_crtc->scanout_pixmap) {
+                       ppriv = msGetPixmapPriv(drmmode, 
crtc->randr_crtc->scanout_pixmap);
+                       drmModeRmFB(drmmode->fd, ppriv->fb_id);
+               }
+               if (drmmode_crtc->slave_damage) {
+                       
DamageUnregister(&crtc->randr_crtc->scanout_pixmap->drawable,
+                                        drmmode_crtc->slave_damage);
+                       drmmode_crtc->slave_damage = NULL;
+               }
+               return TRUE;
+       }
+
+       ppriv = msGetPixmapPriv(drmmode, ppix);
+       if (!drmmode_crtc->slave_damage) {
+               drmmode_crtc->slave_damage = DamageCreate(NULL, NULL,
+                                                         DamageReportNone,
+                                                         TRUE,
+                                                         
crtc->randr_crtc->pScreen,
+                                                         NULL);
+       }
+       ptr = drmmode_map_slave_bo(drmmode, ppriv);
+       ppix->devPrivate.ptr = ptr;
+       DamageRegister(&ppix->drawable, drmmode_crtc->slave_damage);
+
+       if (ppriv->fb_id == 0) {
+               int r;
+               r = drmModeAddFB(drmmode->fd, ppix->drawable.width,
+                                ppix->drawable.height,
+                                ppix->drawable.depth,
+                                ppix->drawable.bitsPerPixel,
+                                ppix->devKind,
+                                ppriv->backing_bo->handle,
+                                &ppriv->fb_id);
+       }
+       return TRUE;
+}
+#endif
+
 static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
     .dpms = drmmode_crtc_dpms,
     .set_mode_major = drmmode_set_mode_major,
@@ -466,6 +558,9 @@ static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
 
     .gamma_set = drmmode_crtc_gamma_set,
     .destroy = NULL, /* XXX */
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+    .set_scanout_pixmap = drmmode_set_scanout_pixmap,
+#endif
 };
 
 static void
@@ -1065,6 +1160,10 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr 
drmmode, int cpp)
        /* workout clones */
        drmmode_clones_init(pScrn, drmmode);
 
+#if XF86_CRTC_VERSION >= 5
+       xf86ProviderSetup(pScrn, NULL, "modesetting");
+#endif
+
        xf86InitialConfiguration(pScrn, TRUE);
 
        return TRUE;
@@ -1324,6 +1423,22 @@ void *drmmode_map_front_bo(drmmode_ptr drmmode)
        
 }
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+void *drmmode_map_slave_bo(drmmode_ptr drmmode, msPixmapPrivPtr ppriv)
+{
+        int ret;
+
+        if (ppriv->backing_bo->ptr)
+                return ppriv->backing_bo->ptr;
+
+        ret = dumb_bo_map(drmmode->fd, ppriv->backing_bo);
+        if (ret)
+                return NULL;
+
+        return ppriv->backing_bo->ptr;  
+}
+#endif
+
 Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 {
        xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index fa280bd..24f7960 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -32,6 +32,11 @@
 #include "libudev.h"
 #endif
 
+/* the perfect storm */
+#if XF86_CRTC_VERSION >= 5 && defined(HAVE_DRMPRIMEFDTOHANDLE) && 
HAVE_SCREEN_SPECIFIC_PRIVATE_KEYS
+#define MODESETTING_OUTPUT_SLAVE_SUPPORT 1
+#endif
+
 struct dumb_bo {
     uint32_t handle;
     uint32_t size;
@@ -58,6 +63,9 @@ typedef struct {
     Bool shadow_enable;
     void *shadow_fb;
 
+#ifdef HAVE_SCREEN_SPECIFIC_PRIVATE_KEYS
+    DevPrivateKeyRec pixmapPrivateKeyRec;
+#endif
 } drmmode_rec, *drmmode_ptr;
 
 typedef struct {
@@ -67,6 +75,7 @@ typedef struct {
     struct dumb_bo *cursor_bo;
     unsigned rotate_fb_id;
     uint16_t lut_r[256], lut_g[256], lut_b[256];
+    DamagePtr slave_damage;
 } drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
 
 typedef struct {
@@ -90,6 +99,23 @@ typedef struct {
     int enc_clone_mask;
 } drmmode_output_private_rec, *drmmode_output_private_ptr;
 
+#ifdef MODESETTING_OUTPUT_SLAVE_SUPPORT
+typedef struct _msPixmapPriv {
+    uint32_t fb_id;
+    struct dumb_bo *backing_bo; /* if this pixmap is backed by a dumb bo */
+} msPixmapPrivRec, *msPixmapPrivPtr;
+
+
+extern DevPrivateKeyRec msPixmapPrivateKeyRec;
+#define msPixmapPrivateKey (&msPixmapPrivateKeyRec)
+
+#define msGetPixmapPriv(drmmode, p) 
((msPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, 
&(drmmode)->pixmapPrivateKeyRec))
+
+void *drmmode_map_slave_bo(drmmode_ptr drmmode, msPixmapPrivPtr ppriv);
+Bool drmmode_SetSlaveBO(PixmapPtr ppix,
+                       drmmode_ptr drmmode,
+                       int fd_handle, int pitch, int size);
+#endif
 
 extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
 void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int 
y, int flags);
@@ -105,6 +131,7 @@ Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr 
drmmode);
 void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
 void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode, int 
*depth, int *bpp);
 
+
 #ifndef DRM_CAP_DUMB_PREFERRED_DEPTH
 #define DRM_CAP_DUMB_PREFERRED_DEPTH 3
 #endif

commit 65054df028047137c7e6b1c749611c751041d7a5
Author: Dave Airlie <airl...@redhat.com>
Date:   Tue Jun 5 14:43:21 2012 +0100

    modesetting: add platform bus support

diff --git a/src/driver.c b/src/driver.c
index 8c3f4a4..86be277 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -52,6 +52,9 @@
 #include "xf86xv.h"
 #include <X11/extensions/Xv.h>
 #include <xorg-server.h>
+#ifdef XSERVER_PLATFORM_BUS
+#include "xf86platformBus.h"
+#endif
 #if XSERVER_LIBPCIACCESS
 #include <pciaccess.h>
 #endif
@@ -88,6 +91,12 @@ static const struct pci_id_match ms_device_match[] = {
 };
 #endif
 
+#ifdef XSERVER_PLATFORM_BUS
+static Bool ms_platform_probe(DriverPtr driver,
+                          int entity_num, int flags, struct 
xf86_platform_device *device,
+                         intptr_t match_data);
+#endif
+
 _X_EXPORT DriverRec modesetting = {
     1,
     "modesetting",
@@ -99,6 +108,9 @@ _X_EXPORT DriverRec modesetting = {
     NULL,
     ms_device_match,
     ms_pci_probe,
+#ifdef XSERVER_PLATFORM_BUS
+    ms_platform_probe,
+#endif
 };
 
 static SymTabRec Chipsets[] = {
@@ -288,6 +300,40 @@ ms_pci_probe(DriverPtr driver,
 }
 #endif
 
+#ifdef XSERVER_PLATFORM_BUS
+static Bool
+ms_platform_probe(DriverPtr driver,
+              int entity_num, int flags, struct xf86_platform_device *dev, 
intptr_t match_data)
+{
+    ScrnInfoPtr scrn = NULL;
+    char *path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH);
+    int scr_flags = 0;
+
+    if (flags & PLATFORM_PROBE_GPU_SCREEN)
+            scr_flags = XF86_ALLOCATE_GPU_SCREEN;
+
+    if (probe_hw(path)) {
+        scrn = xf86AllocateScreen(driver, scr_flags);
+        xf86AddEntityToScreen(scrn, entity_num);
+
+        scrn->driverName = "modesetting";
+        scrn->name = "modesetting";
+        scrn->PreInit = PreInit;
+        scrn->ScreenInit = ScreenInit;
+        scrn->SwitchMode = SwitchMode;
+        scrn->AdjustFrame = AdjustFrame;
+        scrn->EnterVT = EnterVT;
+        scrn->LeaveVT = LeaveVT;
+        scrn->FreeScreen = FreeScreen;
+        scrn->ValidMode = ValidMode;
+        xf86DrvMsg(scrn->scrnIndex, X_INFO,
+                   "using drv %s\n", path ? path : "default device");
+    }
+
+    return scrn != NULL;
+}
+#endif
+
 static Bool
 Probe(DriverPtr drv, int flags)
 {
@@ -431,7 +477,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
     rgb defaultWeight = { 0, 0, 0 };
     EntityInfoPtr pEnt;
     EntPtr msEnt = NULL;
-    char *BusID, *devicename;
+    char *BusID = NULL, *devicename;
     Bool prefer_shadow = TRUE;
     uint64_t value = 0;
     int ret;
@@ -477,24 +523,32 @@ PreInit(ScrnInfoPtr pScrn, int flags)
     pScrn->progClock = TRUE;
     pScrn->rgbBits = 8;
 
-    ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
-    if (ms->PciInfo) {
-       BusID = malloc(64);
-       sprintf(BusID, "PCI:%d:%d:%d",
+#if XSERVER_PLATFORM_BUS
+    if (pEnt->location.type == BUS_PLATFORM) {
+            char *path = 
xf86_get_platform_device_attrib(pEnt->location.id.plat, ODEV_ATTRIB_PATH);
+            ms->fd = open_hw(path);
+    }
+    else 
+#endif
+    if (pEnt->location.type == BUS_PCI) {
+        ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
+        if (ms->PciInfo) {
+            BusID = malloc(64);
+            sprintf(BusID, "PCI:%d:%d:%d",
 #if XSERVER_LIBPCIACCESS
-               ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
-               ms->PciInfo->dev, ms->PciInfo->func
+                    ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
+                    ms->PciInfo->dev, ms->PciInfo->func
 #else
-               ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
-               ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
-               ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
+                    ((pciConfigPtr) ms->PciInfo->thisCard)->busnum,
+                    ((pciConfigPtr) ms->PciInfo->thisCard)->devnum,
+                    ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum
 #endif
-           );
-
-       ms->fd = drmOpen(NULL, BusID);
+                );
+        }
+        ms->fd = drmOpen(NULL, BusID);
     } else {
-       devicename = xf86FindOptionValue(ms->pEnt->device->options, "kmsdev");
-       ms->fd = open_hw(devicename);
+        devicename = xf86FindOptionValue(ms->pEnt->device->options, "kmsdev");
+        ms->fd = open_hw(devicename);
     }
     if (ms->fd < 0)
        return FALSE;

commit 28458c2e6314a4df9be9424f62ffdf8fc77d4d6e
Author: Dave Airlie <airl...@redhat.com>
Date:   Wed Jul 25 15:38:34 2012 +1000

    modesetting: fix warning about close being undefined.
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 185bfe9..9ee553e 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -32,6 +32,7 @@
 #include <errno.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
+#include <unistd.h>
 #include "xf86str.h"
 #include "X11/Xatom.h"
 #include "micmap.h"

commit 95d76b7718c7e0f4564223c65802bb78f01c582d
Author: Dave Airlie <airl...@redhat.com>
Date:   Wed Jul 25 15:33:52 2012 +1000

    modesetting: drop useless xf86PciInfo include
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>

diff --git a/src/driver.c b/src/driver.c
index ad817c4..8c3f4a4 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -38,7 +38,6 @@
 #include "xf86.h"
 #include "xf86_OSproc.h"
 #include "compiler.h"
-#include "xf86PciInfo.h"
 #include "xf86Pci.h"
 #include "mipointer.h"
 #include "micmap.h"


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/e1tc3nm-0000yw...@vasks.debian.org

Reply via email to