diff options
author | Christian König <christian.koenig@amd.com> | 2014-08-07 03:36:04 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-08-11 11:04:26 -0400 |
commit | bd645e4314b95b21146aa6ff893d783de20c4e60 (patch) | |
tree | f047909ba16d95245f7ed22f7c58e121ee51749c | |
parent | 341cb9e426fac32523427c80c67543a16be46605 (diff) |
drm/radeon: allow userptr write access under certain conditions
It needs to be anonymous memory (no file mappings)
and we are requried to install an MMU notifier.
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 | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 2a6fbf101cf0..01b58941acd4 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -285,19 +285,24 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data, | |||
285 | if (offset_in_page(args->addr | args->size)) | 285 | if (offset_in_page(args->addr | args->size)) |
286 | return -EINVAL; | 286 | return -EINVAL; |
287 | 287 | ||
288 | /* we only support read only mappings for now */ | ||
289 | if (!(args->flags & RADEON_GEM_USERPTR_READONLY)) | ||
290 | return -EACCES; | ||
291 | |||
292 | /* reject unknown flag values */ | 288 | /* reject unknown flag values */ |
293 | if (args->flags & ~(RADEON_GEM_USERPTR_READONLY | | 289 | if (args->flags & ~(RADEON_GEM_USERPTR_READONLY | |
294 | RADEON_GEM_USERPTR_ANONONLY | RADEON_GEM_USERPTR_VALIDATE | | 290 | RADEON_GEM_USERPTR_ANONONLY | RADEON_GEM_USERPTR_VALIDATE | |
295 | RADEON_GEM_USERPTR_REGISTER)) | 291 | RADEON_GEM_USERPTR_REGISTER)) |
296 | return -EINVAL; | 292 | return -EINVAL; |
297 | 293 | ||
298 | /* readonly pages not tested on older hardware */ | 294 | if (args->flags & RADEON_GEM_USERPTR_READONLY) { |
299 | if (rdev->family < CHIP_R600) | 295 | /* readonly pages not tested on older hardware */ |
300 | return -EINVAL; | 296 | if (rdev->family < CHIP_R600) |
297 | return -EINVAL; | ||
298 | |||
299 | } else if (!(args->flags & RADEON_GEM_USERPTR_ANONONLY) || | ||
300 | !(args->flags & RADEON_GEM_USERPTR_REGISTER)) { | ||
301 | |||
302 | /* if we want to write to it we must require anonymous | ||
303 | memory and install a MMU notifier */ | ||
304 | return -EACCES; | ||
305 | } | ||
301 | 306 | ||
302 | down_read(&rdev->exclusive_lock); | 307 | down_read(&rdev->exclusive_lock); |
303 | 308 | ||