aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_gem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gem.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c53
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
239int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, 239int 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
256int 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
256int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, 264int 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
357int 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
385int 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}