diff options
author | Christian König <christian.koenig@amd.com> | 2014-08-07 03:36:02 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-08-11 11:04:25 -0400 |
commit | 2a84a4476d6e13de72472f6ca4338aed0a8269b8 (patch) | |
tree | a39411c8cb0dfca623e12801511818a82cd4d74a | |
parent | ddd00e33e17a62c5f44377ab42e7562ccfae7bd1 (diff) |
drm/radeon: add userptr flag to directly validate the BO to GTT
This way we test userptr availability at BO creation time instead of first use.
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 18 | ||||
-rw-r--r-- | include/uapi/drm/radeon_drm.h | 1 |
2 files changed, 18 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 032736b429bf..450656027aba 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -291,7 +291,7 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data, | |||
291 | 291 | ||
292 | /* reject unknown flag values */ | 292 | /* reject unknown flag values */ |
293 | if (args->flags & ~(RADEON_GEM_USERPTR_READONLY | | 293 | if (args->flags & ~(RADEON_GEM_USERPTR_READONLY | |
294 | RADEON_GEM_USERPTR_ANONONLY)) | 294 | RADEON_GEM_USERPTR_ANONONLY | RADEON_GEM_USERPTR_VALIDATE)) |
295 | return -EINVAL; | 295 | return -EINVAL; |
296 | 296 | ||
297 | /* readonly pages not tested on older hardware */ | 297 | /* readonly pages not tested on older hardware */ |
@@ -312,6 +312,22 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data, | |||
312 | if (r) | 312 | if (r) |
313 | goto release_object; | 313 | goto release_object; |
314 | 314 | ||
315 | if (args->flags & RADEON_GEM_USERPTR_VALIDATE) { | ||
316 | down_read(¤t->mm->mmap_sem); | ||
317 | r = radeon_bo_reserve(bo, true); | ||
318 | if (r) { | ||
319 | up_read(¤t->mm->mmap_sem); | ||
320 | goto release_object; | ||
321 | } | ||
322 | |||
323 | radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT); | ||
324 | r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); | ||
325 | radeon_bo_unreserve(bo); | ||
326 | up_read(¤t->mm->mmap_sem); | ||
327 | if (r) | ||
328 | goto release_object; | ||
329 | } | ||
330 | |||
315 | r = drm_gem_handle_create(filp, gobj, &handle); | 331 | r = drm_gem_handle_create(filp, gobj, &handle); |
316 | /* drop reference from allocate - handle holds it now */ | 332 | /* drop reference from allocate - handle holds it now */ |
317 | drm_gem_object_unreference_unlocked(gobj); | 333 | drm_gem_object_unreference_unlocked(gobj); |
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h index 9720e1a36848..5dc61c2d4c73 100644 --- a/include/uapi/drm/radeon_drm.h +++ b/include/uapi/drm/radeon_drm.h | |||
@@ -817,6 +817,7 @@ struct drm_radeon_gem_create { | |||
817 | */ | 817 | */ |
818 | #define RADEON_GEM_USERPTR_READONLY (1 << 0) | 818 | #define RADEON_GEM_USERPTR_READONLY (1 << 0) |
819 | #define RADEON_GEM_USERPTR_ANONONLY (1 << 1) | 819 | #define RADEON_GEM_USERPTR_ANONONLY (1 << 1) |
820 | #define RADEON_GEM_USERPTR_VALIDATE (1 << 2) | ||
820 | 821 | ||
821 | struct drm_radeon_gem_userptr { | 822 | struct drm_radeon_gem_userptr { |
822 | uint64_t addr; | 823 | uint64_t addr; |