[PATCH] Bail if we're trying to start up in UMS mode on KMS.
Alex Deucher
alexdeucher at gmail.com
Wed Aug 17 08:05:08 PDT 2011
2011/8/17 Michel Dänzer <michel at daenzer.net>:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Ideally, the display manager will start the X server again, and everything
> will be fine and dandy. But in the worst case, at least we won't hit the
> hardware behind the KMS driver's back.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
One comment below. Other than that:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/radeon.h | 2 +-
> src/radeon_dri.c | 29 ++++++++++++++++++++++-------
> src/radeon_driver.c | 8 ++++++--
> 3 files changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/src/radeon.h b/src/radeon.h
> index f66ffd0..151d85a 100644
> --- a/src/radeon.h
> +++ b/src/radeon.h
> @@ -1240,7 +1240,7 @@ extern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen);
> extern void RADEONDRICloseScreen(ScreenPtr pScreen);
> extern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen);
> extern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn);
> -extern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn);
> +extern int RADEONDRIGetVersion(ScrnInfoPtr pScrn);
> extern void RADEONDRIResume(ScreenPtr pScreen);
> extern Bool RADEONDRIScreenInit(ScreenPtr pScreen);
> extern int RADEONDRISetParam(ScrnInfoPtr pScrn,
> diff --git a/src/radeon_dri.c b/src/radeon_dri.c
> index ed167ed..946b4dc 100644
> --- a/src/radeon_dri.c
> +++ b/src/radeon_dri.c
> @@ -1336,7 +1336,7 @@ static void RADEONDRICPInit(ScrnInfoPtr pScrn)
>
>
> /* Get the DRM version and do some basic useability checks of DRI */
> -Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn)
> +int RADEONDRIGetVersion(ScrnInfoPtr pScrn)
> {
> RADEONInfoPtr info = RADEONPTR(pScrn);
> int major, minor, patch, fd;
> @@ -1452,8 +1452,26 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn)
> }
>
> /* We don't, bummer ! */
> - if (info->dri->pKernelDRMVersion->version_major != req_major ||
> - info->dri->pKernelDRMVersion->version_minor < req_minor ||
> + if (info->dri->pKernelDRMVersion->version_major != req_major) {
> + /* Looks like we're trying to start in UMS mode on a KMS kernel.
> + * This can happen if the radeon kernel module wasn't loaded before
> + * X starts.
> + */
> + xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
> + "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n"
> + "[dri] This chipset requires a kernel module version of %d.%d.%d,\n"
> + "[dri] but the kernel reports a version of %d.%d.%d."
> + "[dri] Make sure your module is loaded prior to starting X, and\n"
> + "[dri] that this driver was built with support for KMS.\n"
> + "[dri] Aborting.\n",
> + req_major, req_minor, req_patch,
> + info->dri->pKernelDRMVersion->version_major,
> + info->dri->pKernelDRMVersion->version_minor,
> + info->dri->pKernelDRMVersion->version_patchlevel);
> + drmFreeVersion(info->dri->pKernelDRMVersion);
> + info->dri->pKernelDRMVersion = NULL;
> + return -1;
> + } else if (info->dri->pKernelDRMVersion->version_minor < req_minor ||
> (info->dri->pKernelDRMVersion->version_minor == req_minor &&
> info->dri->pKernelDRMVersion->version_patchlevel < req_patch)) {
> /* Incompatible drm version */
> @@ -1461,10 +1479,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn)
> "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n"
> "[dri] This chipset requires a kernel module version of %d.%d.%d,\n"
> "[dri] but the kernel reports a version of %d.%d.%d."
> - "[dri] If using legacy modesetting, upgrade your kernel.\n"
> - "[dri] If using kernel modesetting, make sure your module is\n"
> - "[dri] loaded prior to starting X, and that this driver was built\n"
> - "[dri] with support for KMS.\n"
> + "[dri] Try upgrading your kernel.\n"
> "[dri] Disabling DRI.\n",
> req_major, req_minor, req_patch,
> info->dri->pKernelDRMVersion->version_major,
> diff --git a/src/radeon_driver.c b/src/radeon_driver.c
> index 202951f..1a5b334 100644
> --- a/src/radeon_driver.c
> +++ b/src/radeon_driver.c
> @@ -2333,7 +2333,7 @@ static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn, xf86Int10InfoPtr *ppInt10)
> }
>
> #ifdef XF86DRI
> -static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn)
> +static int RADEONPreInitDRI(ScrnInfoPtr pScrn)
> {
> RADEONInfoPtr info = RADEONPTR(pScrn);
> MessageType from;
> @@ -2402,7 +2402,9 @@ static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn)
> info->dri->pLibDRMVersion = NULL;
> info->dri->pKernelDRMVersion = NULL;
>
> - if (!RADEONDRIGetVersion(pScrn))
> + if (RADEONDRIGetVersion(pScrn) < 0)
> + return -1;
> + else if (!RADEONDRIGetVersion(pScrn))
> return FALSE;
for consistency, might be worth changing FALSE/TRUE to 0/1 since you
changed the return type.
>
> xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> @@ -3166,6 +3168,8 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags)
> * memory map
> */
> info->directRenderingEnabled = RADEONPreInitDRI(pScrn);
> + if (info->directRenderingEnabled < 0)
> + goto fail;
> #endif
> if (!info->directRenderingEnabled) {
> if (info->ChipFamily >= CHIP_FAMILY_R600) {
> --
> 1.7.5.4
>
>
> _______________________________________________
> xorg-driver-ati mailing list
> xorg-driver-ati at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-driver-ati
>
More information about the xorg-driver-ati
mailing list