[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