summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2014-04-26 09:45:05 -0400
committerRob Clark <robdclark@gmail.com>2014-04-26 10:07:03 -0400
commit7b0db1a28f3fe0e6189be602481ed697644f1920 (patch)
tree6d5dfeaffcc53df874338655db281c48f30ba24f
parentf71bfa9311a0d3c053159a5106ddde2582db88d0 (diff)
kms: fix crash on startup with no display
We need to have *some* scanout buffer, even if it will be re-allocated when a display is actually attached. Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--src/drmmode_display.c23
-rw-r--r--src/msm-driver.c5
-rw-r--r--src/msm.h2
3 files changed, 26 insertions, 4 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 28c824f..a3a89ff 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1079,7 +1079,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr pScrn, int width, int height)
if ((pScrn->virtualX == width) &&
(pScrn->virtualY == height) &&
- pMsm->scanout)
+ pMsm->scanout && drmmode->fb_id)
return TRUE;
old_width = pScrn->virtualX;
@@ -1467,11 +1467,28 @@ drmmode_wait_for_event(ScrnInfoPtr pScrn)
drmHandleEvent(drmmode->fd, &drmmode->event_context);
}
-void
+Bool
drmmode_screen_init(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
drmmode_ptr drmmode = drmmode_from_scrn(pScrn);
+ MSMPtr pMsm = MSMPTR(pScrn);
+ int pitch, size;
+
+ /* NOTE: we need an initial scanout buffer, in case no attached
+ * display:
+ */
+ pitch = MSMAlignedStride(pScrn->virtualX, pScrn->bitsPerPixel);
+ size = pitch * pScrn->virtualY;
+ DEBUG_MSG("initial scanout buffer: %dx%d@%d (size=%d, pitch=%d)",
+ pScrn->virtualX, pScrn->virtualY, pScrn->bitsPerPixel,
+ size, pitch);
+ pMsm->scanout = fd_bo_new(pMsm->dev, size,
+ DRM_FREEDRENO_GEM_TYPE_KMEM);
+ if (!pMsm->scanout) {
+ ERROR_MSG("Error allocating scanout buffer");
+ return FALSE;
+ }
drmmode_uevent_init(pScrn);
@@ -1484,6 +1501,8 @@ drmmode_screen_init(ScreenPtr pScreen)
/* Register a wakeup handler to get informed on DRM events */
RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
drmmode_wakeup_handler, pScrn);
+
+ return TRUE;
}
void
diff --git a/src/msm-driver.c b/src/msm-driver.c
index be2b9e3..440da52 100644
--- a/src/msm-driver.c
+++ b/src/msm-driver.c
@@ -468,7 +468,10 @@ MSMScreenInit(SCREEN_INIT_ARGS_DECL)
return FALSE;
}
} else {
- drmmode_screen_init(pScreen);
+ if (!drmmode_screen_init(pScreen)) {
+ ERROR_MSG("drmmode_screen_init failed");
+ return FALSE;
+ }
}
return TRUE;
diff --git a/src/msm.h b/src/msm.h
index ca49ee7..c0230f3 100644
--- a/src/msm.h
+++ b/src/msm.h
@@ -141,7 +141,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
int drmmode_cursor_init(ScreenPtr pScreen);
Bool drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv);
void drmmode_wait_for_event(ScrnInfoPtr pScrn);
-void drmmode_screen_init(ScreenPtr pScreen);
+Bool drmmode_screen_init(ScreenPtr pScreen);
void drmmode_screen_fini(ScreenPtr pScreen);
Bool fbmode_pre_init(ScrnInfoPtr pScrn);