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