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 <christian.koenig@amd.com>
This commit is contained in:
Marek Olšák
2015-02-11 20:25:16 +01:00
parent 064847122a
commit c688988b0d
5 changed files with 35 additions and 19 deletions
@@ -42,24 +42,6 @@
#include <fcntl.h>
#include <stdio.h>
#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)
@@ -28,7 +28,6 @@
#define RADEON_DRM_CS_H
#include "radeon_drm_bo.h"
#include <radeon_drm.h>
struct radeon_cs_context {
uint32_t buf[RADEON_MAX_CMDBUF_DWORDS];
@@ -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));
@@ -32,6 +32,25 @@
#include "radeon_winsys.h"
#include "os/os_thread.h"
#include <radeon_drm.h>
#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;
@@ -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;