summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-09-29 14:05:43 +0100
committerDave Airlie <airlied@redhat.com>2011-09-29 14:05:43 +0100
commit1b9690d2b1f1bc33f149ff7ab8950b24029c030c (patch)
tree45adead965674b5b9c3ffb4ec9f435200628be20
parent59a4776f7b4e0f9bbbafe62972487354a8fabda0 (diff)
fix server recycling
-rw-r--r--src/driver.c38
-rw-r--r--src/drmmode_display.c6
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;