From: Marek Olšák Date: Wed, 11 Feb 2015 19:25:16 +0000 (+0100) Subject: winsys/radeon: test the userptr ioctl to see if it's present X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c688988b0d68ffee2d8f1d64b0d402e23e8ce49e;p=mesa.git winsys/radeon: test the userptr ioctl to see if it's present There is no other way to check for support. Reviewed-by: Christian König --- diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index e3b2c228378..e609d686837 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -42,24 +42,6 @@ #include #include -#ifndef DRM_RADEON_GEM_USERPTR - -#define DRM_RADEON_GEM_USERPTR 0x2d - -#define RADEON_GEM_USERPTR_READONLY (1 << 0) -#define RADEON_GEM_USERPTR_ANONONLY (1 << 1) -#define RADEON_GEM_USERPTR_VALIDATE (1 << 2) -#define RADEON_GEM_USERPTR_REGISTER (1 << 3) - -struct drm_radeon_gem_userptr { - uint64_t addr; - uint64_t size; - uint32_t flags; - uint32_t handle; -}; - -#endif - extern const struct pb_vtbl radeon_bo_vtbl; static INLINE struct radeon_bo *radeon_bo(struct pb_buffer *bo) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h index 089494eac23..fcc29fe9480 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h @@ -28,7 +28,6 @@ #define RADEON_DRM_CS_H #include "radeon_drm_bo.h" -#include struct radeon_cs_context { uint32_t buf[RADEON_MAX_CMDBUF_DWORDS]; diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index 72b7931936a..2b12f4da466 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -309,6 +309,21 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws) } } + /* Check for userptr support. */ + { + struct drm_radeon_gem_userptr args = {0}; + + /* If the ioctl doesn't exist, -EINVAL is returned. + * + * If the ioctl exists, it should return -EACCES + * if RADEON_GEM_USERPTR_READONLY or RADEON_GEM_USERPTR_REGISTER + * aren't set. + */ + ws->info.has_userptr = + drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_USERPTR, + &args, sizeof(args)) == -EACCES; + } + /* Get GEM info. */ retval = drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_INFO, &gem_info, sizeof(gem_info)); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h index 1e0c632be99..5711ffa8e53 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h @@ -32,6 +32,25 @@ #include "radeon_winsys.h" #include "os/os_thread.h" +#include + +#ifndef DRM_RADEON_GEM_USERPTR + +#define DRM_RADEON_GEM_USERPTR 0x2d + +#define RADEON_GEM_USERPTR_READONLY (1 << 0) +#define RADEON_GEM_USERPTR_ANONONLY (1 << 1) +#define RADEON_GEM_USERPTR_VALIDATE (1 << 2) +#define RADEON_GEM_USERPTR_REGISTER (1 << 3) + +struct drm_radeon_gem_userptr { + uint64_t addr; + uint64_t size; + uint32_t flags; + uint32_t handle; +}; + +#endif struct radeon_drm_cs; diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h index 3a6037c0542..a8cc60a33e4 100644 --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h @@ -214,6 +214,7 @@ struct radeon_info { boolean has_uvd; uint32_t vce_fw_version; + boolean has_userptr; uint32_t r300_num_gb_pipes; uint32_t r300_num_z_pipes;