This patch contains a fix and additional debug statements used to help isolate an error that causes a lockup on Menlow for ubuntu-mobile. It seems that psbDRILock() gets called twice, and the second time it gets stuck in a kernel ioctl call in libdrm. This fix simply disables the lock (and subsequent unlock), which may not be a perfect fix, but is enabling the system to start X rather than lockup. diff -Nurp xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/debian/patches/103_psb_debugs.patch xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/debian/patches/103_psb_debugs.patch --- xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/debian/patches/103_psb_debugs.patch 2008-01-17 19:11:58.000000000 +0000 +++ xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/debian/patches/103_psb_debugs.patch 2008-01-17 19:08:47.000000000 +0000 @@ -0,0 +1,93 @@ +--- xserver-xorg-video-psb-0.2.6/src/psb_dri.c 2007-12-18 12:35:09.000000000 -0800 ++++ xserver-xorg-video-psb-0.2.6-0ubuntu1~psb3/src/psb_dri.c 2008-01-15 19:22:36.942369627 -0800 +@@ -237,7 +237,7 @@ psbDeviceLegacyDRIInit(ScreenPtr pScreen + goto out_err; + } else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, +- "[drm] Allocated device DRM context %d.\n", ++ "[drm] Allocated (legacy) device DRM context %d.\n", + (int)pDevice->drmContext); + } + +@@ -642,8 +642,11 @@ psbDRIScreenInit(ScreenPtr pScreen) + goto out_err; + } + #if PSB_LEGACY_DRI +- if (!psbDeviceLegacyDRIInit(pScreen)) ++ if (!psbDeviceLegacyDRIInit(pScreen)) { ++ xf86DrvMsg(pScreen->myNum, X_ERROR, ++ "[dri] Failed to init Legacy DRI device. Closing screen\n"); + goto out_err; ++ } + #endif + + return TRUE; +--- xserver-xorg-video-psb-0.2.6/src/psb_driver.c 2007-12-18 12:35:09.000000000 -0800 ++++ xserver-xorg-video-psb-0.2.6-0ubuntu1~psb3/src/psb_driver.c 2008-01-15 19:28:33.980767805 -0800 +@@ -1293,6 +1293,8 @@ psbScreenInit(int scrnIndex, ScreenPtr p + "This driver currently needs DRM to operate.\n"); + return FALSE; + } ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Creating memory manager.\n"); + pDevice->man = mmCreateDRM(pDevice->drmFD); + if (!pDevice->man) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, +@@ -1302,10 +1304,13 @@ psbScreenInit(int scrnIndex, ScreenPtr p + } + #else + if (pDevice->hasDRM) ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Initting DRI Screen\n"); + driEnabled = psbDRIScreenInit(pScreen); + #endif + #endif + ++ PSB_DEBUG(scrnIndex, 3, "serverGeneration\n"); + if (serverGeneration != pPsb->serverGeneration) { + + /* +@@ -1317,18 +1322,26 @@ psbScreenInit(int scrnIndex, ScreenPtr p + /* Unfortunately the Xserver is broken with regard to canGrow, so + * we need to set this to FALSE for now. + */ ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Calling xf86InitialConfiguration()\n"); + if (!xf86InitialConfiguration(pScrn, FALSE)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Could not find a valid initial configuration " + "for this screen\n"); + goto out_err; + } ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Checking PSB Crtcs\n"); + psbCheckCrtcs(pDevice); + } + + pScrn->pScreen = pScreen; + ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Locking DRI for screen\n"); + psbDRILock(pScrn, 0); ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Creating PSB Scanout\n"); + pPsb->front = psbScanoutCreate(pScrn, pScrn->bitsPerPixel >> 3, + pScrn->depth, pScrn->virtualX, + pScrn->virtualY, 0, -1, 0); +@@ -1344,11 +1357,16 @@ psbScreenInit(int scrnIndex, ScreenPtr p + pPsb->stride = psbScanoutStride(pPsb->front); + pPsb->cpp = psbScanoutCpp(pPsb->front); + ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Starting handling of mi layer\n"); + /* mi layer */ ++ PSB_DEBUG(scrnIndex, 3, "mi layer\n"); + miClearVisualTypes(); + if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual)) + goto out_err_unlock; ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "Setting mi Pixmap Depths\n"); + if (!miSetPixmapDepths()) + goto out_err_unlock; + diff -Nurp xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/src/psb_dri.c xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/src/psb_dri.c --- xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/src/psb_dri.c 2008-01-16 19:19:20.000000000 +0000 +++ xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/src/psb_dri.c 2008-01-17 19:09:02.000000000 +0000 @@ -237,7 +237,7 @@ psbDeviceLegacyDRIInit(ScreenPtr pScreen goto out_err; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "[drm] Allocated device DRM context %d.\n", + "[drm] Allocated (legacy) device DRM context %d.\n", (int)pDevice->drmContext); } @@ -642,8 +642,11 @@ psbDRIScreenInit(ScreenPtr pScreen) goto out_err; } #if PSB_LEGACY_DRI - if (!psbDeviceLegacyDRIInit(pScreen)) + if (!psbDeviceLegacyDRIInit(pScreen)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] Failed to init Legacy DRI device. Closing screen\n"); goto out_err; + } #endif return TRUE; diff -Nurp xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/src/psb_driver.c xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/src/psb_driver.c --- xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1/src/psb_driver.c 2008-01-16 19:19:20.000000000 +0000 +++ xserver-xorg-video-psb-0.2.6-0ubuntu1~804um1-modified/src/psb_driver.c 2008-01-17 19:11:25.000000000 +0000 @@ -1293,6 +1293,8 @@ psbScreenInit(int scrnIndex, ScreenPtr p "This driver currently needs DRM to operate.\n"); return FALSE; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Creating memory manager.\n"); pDevice->man = mmCreateDRM(pDevice->drmFD); if (!pDevice->man) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -1302,10 +1304,13 @@ psbScreenInit(int scrnIndex, ScreenPtr p } #else if (pDevice->hasDRM) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Initting DRI Screen\n"); driEnabled = psbDRIScreenInit(pScreen); #endif #endif + PSB_DEBUG(scrnIndex, 3, "serverGeneration\n"); if (serverGeneration != pPsb->serverGeneration) { /* @@ -1317,18 +1322,28 @@ psbScreenInit(int scrnIndex, ScreenPtr p /* Unfortunately the Xserver is broken with regard to canGrow, so * we need to set this to FALSE for now. */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Calling xf86InitialConfiguration()\n"); if (!xf86InitialConfiguration(pScrn, FALSE)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not find a valid initial configuration " "for this screen\n"); goto out_err; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Checking PSB Crtcs\n"); psbCheckCrtcs(pDevice); } pScrn->pScreen = pScreen; + /* + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Locking DRI for screen\n"); psbDRILock(pScrn, 0); + */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Creating PSB Scanout\n"); pPsb->front = psbScanoutCreate(pScrn, pScrn->bitsPerPixel >> 3, pScrn->depth, pScrn->virtualX, pScrn->virtualY, 0, -1, 0); @@ -1344,11 +1359,16 @@ psbScreenInit(int scrnIndex, ScreenPtr p pPsb->stride = psbScanoutStride(pPsb->front); pPsb->cpp = psbScanoutCpp(pPsb->front); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Starting handling of mi layer\n"); /* mi layer */ + PSB_DEBUG(scrnIndex, 3, "mi layer\n"); miClearVisualTypes(); if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), pScrn->rgbBits, pScrn->defaultVisual)) goto out_err_unlock; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Setting mi Pixmap Depths\n"); if (!miSetPixmapDepths()) goto out_err_unlock; @@ -1491,7 +1511,9 @@ psbScreenInit(int scrnIndex, ScreenPtr p return psbEnterVT(pScreen->myNum, 0); out_err_unlock: + /* psbDRIUnlock(pScrn); + */ out_err: psbRestoreHWState(pDevice); return FALSE;