diff options
author | Dave Airlie <airlied@redhat.com> | 2011-09-29 14:05:43 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-09-29 14:05:43 +0100 |
commit | 1b9690d2b1f1bc33f149ff7ab8950b24029c030c (patch) | |
tree | 45adead965674b5b9c3ffb4ec9f435200628be20 | |
parent | 59a4776f7b4e0f9bbbafe62972487354a8fabda0 (diff) |
fix server recycling
-rw-r--r-- | src/driver.c | 38 | ||||
-rw-r--r-- | src/drmmode_display.c | 6 |
2 files changed, 19 insertions, 25 deletions
diff --git a/src/driver.c b/src/driver.c index bc80e30..b56db94 100644 --- a/src/driver.c +++ b/src/driver.c @@ -570,31 +570,17 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) unsigned long sys_mem; int c; MessageType from; + int ret; - /* deal with server regeneration */ - if (ms->fd < 0) { - char *BusID; - - 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 -#else - ((pciConfigPtr) ms->PciInfo->thisCard)->busnum, - ((pciConfigPtr) ms->PciInfo->thisCard)->devnum, - ((pciConfigPtr) ms->PciInfo->thisCard)->funcnum -#endif - ); - - ms->fd = drmOpen(NULL, BusID); - - if (ms->fd < 0) - return FALSE; - } - + ErrorF("ms is %p\n", ms); pScrn->pScreen = pScreen; + ret = drmSetMaster(ms->fd); + if (ret) { + ErrorF("Unable to set master\n"); + return FALSE; + } + /* HW dependent - FIXME */ pScrn->displayWidth = pScrn->virtualX; if (!drmmode_create_initial_bos(pScrn, &ms->drmmode)) @@ -716,7 +702,9 @@ EnterVT(int scrnIndex, int flags) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; modesettingPtr ms = modesettingPTR(pScrn); - if (!xf86SetDesiredModes(pScrn)) + pScrn->vtSema = TRUE; + + if (!drmmode_set_desired_modes(pScrn, &ms->drmmode)) return FALSE; return TRUE; @@ -752,8 +740,8 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen) pScreen->CreateScreenResources = ms->createScreenResources; pScreen->BlockHandler = ms->BlockHandler; - drmClose(ms->fd); - ms->fd = -1; + + drmDropMaster(ms->fd); pScrn->vtSema = FALSE; pScreen->CloseScreen = ms->CloseScreen; diff --git a/src/drmmode_display.c b/src/drmmode_display.c index d94ce03..4f25bbe 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1329,6 +1329,12 @@ void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int i; + + if (drmmode->fb_id) { + drmModeRmFB(drmmode->fd, drmmode->fb_id); + drmmode->fb_id = 0; + } + dumb_bo_destroy(drmmode->fd, drmmode->front_bo); drmmode->front_bo = NULL; |