[Mesa-dev] [PATCH 1/2] winsys/radeon: Add a work around for drmGetVersion() when using render nodes

David Herrmann dh.herrmann at gmail.com
Wed Oct 30 08:19:40 CET 2013


Hi Tom

On Tue, Oct 29, 2013 at 9:00 PM, Tom Stellard <tom at stellard.net> wrote:
> From: Tom Stellard <thomas.stellard at amd.com>
>
> DRM_IOCTL_VERSION is not currently a legal ioctl for render nodes, so we
> need to hard code the drm version when drmGetVersion() returns NULL.
> ---
>  src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 36 ++++++++++++++++-------
>  1 file changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> index f8aeb96..5b5191a 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> @@ -212,23 +212,37 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
>
>      /* Get DRM version. */
>      version = drmGetVersion(ws->fd);
> -    if (version->version_major != 2 ||
> -        version->version_minor < 3) {
> +
> +    if (!version) {

"version" might be NULL on OOM, too (which we didn't check in the
previous code..). I don't really like this fallback. drmGetVersion()
will be allowed on all render-nodes which are not experimental (which
don't need drm.rnodes=1). It seems tedious to me to support this
fallback-code just for one experimental kernel-revision.

But that's just my opinion. The code looks fine so far.

Thanks
David

> +#ifdef USE_RENDER_NODES
> +        /* Calling drmGetVersion was not allowed in the earliest
> +         * implementation of render nodes.  To work around this, we will
> +         * hard code to the oldest version with render node support.
> +         */
> +        ws->info.drm_major = 2; // version->version_major;
> +        ws->info.drm_minor = 32; //version->version_minor;
> +        ws->info.drm_patchlevel = 0; // version->version_patchlevel;
> +#else
> +        return false;
> +#endif
> +    } else {
> +        ws->info.drm_major = version->version_major;
> +        ws->info.drm_minor = version->version_minor;
> +        ws->info.drm_patchlevel = version->version_patchlevel;
> +        drmFreeVersion(version);
> +    }
> +
> +    if (ws->info.drm_major != 2 ||
> +        ws->info.drm_minor < 3) {
>          fprintf(stderr, "%s: DRM version is %d.%d.%d but this driver is "
>                  "only compatible with 2.3.x (kernel 2.6.34) or later.\n",
>                  __FUNCTION__,
> -                version->version_major,
> -                version->version_minor,
> -                version->version_patchlevel);
> -        drmFreeVersion(version);
> +                ws->info.drm_major,
> +                ws->info.drm_minor,
> +                ws->info.drm_patchlevel);
>          return FALSE;
>      }
>
> -    ws->info.drm_major = version->version_major;
> -    ws->info.drm_minor = version->version_minor;
> -    ws->info.drm_patchlevel = version->version_patchlevel;
> -    drmFreeVersion(version);
> -
>      /* Get PCI ID. */
>      if (!radeon_get_drm_value(ws->fd, RADEON_INFO_DEVICE_ID, "PCI ID",
>                                &ws->info.pci_id))
> --
> 1.8.1.5
>


More information about the mesa-dev mailing list