diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gem.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index df95eb83dac6..ede5dccdf79f 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -236,23 +236,31 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
236 | return r; | 236 | return r; |
237 | } | 237 | } |
238 | 238 | ||
239 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | 239 | int radeon_mode_dumb_mmap(struct drm_file *filp, |
240 | struct drm_file *filp) | 240 | struct drm_device *dev, |
241 | uint32_t handle, uint64_t *offset_p) | ||
241 | { | 242 | { |
242 | struct drm_radeon_gem_mmap *args = data; | ||
243 | struct drm_gem_object *gobj; | 243 | struct drm_gem_object *gobj; |
244 | struct radeon_bo *robj; | 244 | struct radeon_bo *robj; |
245 | 245 | ||
246 | gobj = drm_gem_object_lookup(dev, filp, args->handle); | 246 | gobj = drm_gem_object_lookup(dev, filp, handle); |
247 | if (gobj == NULL) { | 247 | if (gobj == NULL) { |
248 | return -ENOENT; | 248 | return -ENOENT; |
249 | } | 249 | } |
250 | robj = gobj->driver_private; | 250 | robj = gobj->driver_private; |
251 | args->addr_ptr = radeon_bo_mmap_offset(robj); | 251 | *offset_p = radeon_bo_mmap_offset(robj); |
252 | drm_gem_object_unreference_unlocked(gobj); | 252 | drm_gem_object_unreference_unlocked(gobj); |
253 | return 0; | 253 | return 0; |
254 | } | 254 | } |
255 | 255 | ||
256 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | ||
257 | struct drm_file *filp) | ||
258 | { | ||
259 | struct drm_radeon_gem_mmap *args = data; | ||
260 | |||
261 | return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr); | ||
262 | } | ||
263 | |||
256 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | 264 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
257 | struct drm_file *filp) | 265 | struct drm_file *filp) |
258 | { | 266 | { |
@@ -345,3 +353,38 @@ out: | |||
345 | drm_gem_object_unreference_unlocked(gobj); | 353 | drm_gem_object_unreference_unlocked(gobj); |
346 | return r; | 354 | return r; |
347 | } | 355 | } |
356 | |||
357 | int radeon_mode_dumb_create(struct drm_file *file_priv, | ||
358 | struct drm_device *dev, | ||
359 | struct drm_mode_create_dumb *args) | ||
360 | { | ||
361 | struct radeon_device *rdev = dev->dev_private; | ||
362 | struct drm_gem_object *gobj; | ||
363 | int r; | ||
364 | |||
365 | args->pitch = radeon_align_pitch(rdev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); | ||
366 | args->size = args->pitch * args->height; | ||
367 | args->size = ALIGN(args->size, PAGE_SIZE); | ||
368 | |||
369 | r = radeon_gem_object_create(rdev, args->size, 0, | ||
370 | RADEON_GEM_DOMAIN_VRAM, | ||
371 | false, ttm_bo_type_device, | ||
372 | &gobj); | ||
373 | if (r) | ||
374 | return -ENOMEM; | ||
375 | |||
376 | r = drm_gem_handle_create(file_priv, gobj, &args->handle); | ||
377 | if (r) { | ||
378 | drm_gem_object_unreference_unlocked(gobj); | ||
379 | return r; | ||
380 | } | ||
381 | drm_gem_object_handle_unreference_unlocked(gobj); | ||
382 | return 0; | ||
383 | } | ||
384 | |||
385 | int radeon_mode_dumb_destroy(struct drm_file *file_priv, | ||
386 | struct drm_device *dev, | ||
387 | uint32_t handle) | ||
388 | { | ||
389 | return drm_gem_handle_delete(file_priv, handle); | ||
390 | } | ||