aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c33
-rw-r--r--drivers/gpu/drm/drm_drv.c5
-rw-r--r--drivers/gpu/drm/drm_gem.c3
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c3
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h7
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c103
-rw-r--r--drivers/gpu/drm/radeon/radeon.h9
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c53
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
-rw-r--r--include/drm/drm.h4
-rw-r--r--include/drm/drmP.h12
-rw-r--r--include/drm/drm_crtc.h7
-rw-r--r--include/drm/drm_mode.h29
15 files changed, 246 insertions, 38 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 654faa803dcb..4c95b5fd9df3 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -2694,3 +2694,36 @@ void drm_mode_config_reset(struct drm_device *dev)
2694 connector->funcs->reset(connector); 2694 connector->funcs->reset(connector);
2695} 2695}
2696EXPORT_SYMBOL(drm_mode_config_reset); 2696EXPORT_SYMBOL(drm_mode_config_reset);
2697
2698int drm_mode_create_dumb_ioctl(struct drm_device *dev,
2699 void *data, struct drm_file *file_priv)
2700{
2701 struct drm_mode_create_dumb *args = data;
2702
2703 if (!dev->driver->dumb_create)
2704 return -ENOSYS;
2705 return dev->driver->dumb_create(file_priv, dev, args);
2706}
2707
2708int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
2709 void *data, struct drm_file *file_priv)
2710{
2711 struct drm_mode_map_dumb *args = data;
2712
2713 /* call driver ioctl to get mmap offset */
2714 if (!dev->driver->dumb_map_offset)
2715 return -ENOSYS;
2716
2717 return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset);
2718}
2719
2720int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
2721 void *data, struct drm_file *file_priv)
2722{
2723 struct drm_mode_destroy_dumb *args = data;
2724
2725 if (!dev->driver->dumb_destroy)
2726 return -ENOSYS;
2727
2728 return dev->driver->dumb_destroy(file_priv, dev, args->handle);
2729}
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 271835a71570..3e991980cee2 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -150,7 +150,10 @@ static struct drm_ioctl_desc drm_ioctls[] = {
150 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 150 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED) 153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
154 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
155 DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
156 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
154}; 157};
155 158
156#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) 159#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index ea1c4b019ebf..aa8df2534819 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -181,7 +181,7 @@ EXPORT_SYMBOL(drm_gem_object_alloc);
181/** 181/**
182 * Removes the mapping from handle to filp for this object. 182 * Removes the mapping from handle to filp for this object.
183 */ 183 */
184static int 184int
185drm_gem_handle_delete(struct drm_file *filp, u32 handle) 185drm_gem_handle_delete(struct drm_file *filp, u32 handle)
186{ 186{
187 struct drm_device *dev; 187 struct drm_device *dev;
@@ -214,6 +214,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
214 214
215 return 0; 215 return 0;
216} 216}
217EXPORT_SYMBOL(drm_gem_handle_delete);
217 218
218/** 219/**
219 * Create a handle for this object. This adds a handle reference 220 * Create a handle for this object. This adds a handle reference
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index cfb56d0ff367..17fde2f27418 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -700,6 +700,9 @@ static struct drm_driver driver = {
700 .gem_init_object = i915_gem_init_object, 700 .gem_init_object = i915_gem_init_object,
701 .gem_free_object = i915_gem_free_object, 701 .gem_free_object = i915_gem_free_object,
702 .gem_vm_ops = &i915_gem_vm_ops, 702 .gem_vm_ops = &i915_gem_vm_ops,
703 .dumb_create = i915_gem_dumb_create,
704 .dumb_map_offset = i915_gem_mmap_gtt,
705 .dumb_destroy = i915_gem_dumb_destroy,
703 .ioctls = i915_ioctls, 706 .ioctls = i915_ioctls,
704 .fops = { 707 .fops = {
705 .owner = THIS_MODULE, 708 .owner = THIS_MODULE,
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a0149c619cdd..a78197d43ce6 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1114,6 +1114,13 @@ void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
1114 struct intel_ring_buffer *ring, 1114 struct intel_ring_buffer *ring,
1115 u32 seqno); 1115 u32 seqno);
1116 1116
1117int i915_gem_dumb_create(struct drm_file *file_priv,
1118 struct drm_device *dev,
1119 struct drm_mode_create_dumb *args);
1120int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev,
1121 uint32_t handle, uint64_t *offset);
1122int i915_gem_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev,
1123 uint32_t handle);
1117/** 1124/**
1118 * Returns true if seq1 is later than seq2. 1125 * Returns true if seq1 is later than seq2.
1119 */ 1126 */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index cf4f74c7c6fb..bc7f06b8fbca 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -193,22 +193,20 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
193 return 0; 193 return 0;
194} 194}
195 195
196/** 196static int
197 * Creates a new mm object and returns a handle to it. 197i915_gem_create(struct drm_file *file,
198 */ 198 struct drm_device *dev,
199int 199 uint64_t size,
200i915_gem_create_ioctl(struct drm_device *dev, void *data, 200 uint32_t *handle_p)
201 struct drm_file *file)
202{ 201{
203 struct drm_i915_gem_create *args = data;
204 struct drm_i915_gem_object *obj; 202 struct drm_i915_gem_object *obj;
205 int ret; 203 int ret;
206 u32 handle; 204 u32 handle;
207 205
208 args->size = roundup(args->size, PAGE_SIZE); 206 size = roundup(size, PAGE_SIZE);
209 207
210 /* Allocate the new object */ 208 /* Allocate the new object */
211 obj = i915_gem_alloc_object(dev, args->size); 209 obj = i915_gem_alloc_object(dev, size);
212 if (obj == NULL) 210 if (obj == NULL)
213 return -ENOMEM; 211 return -ENOMEM;
214 212
@@ -224,10 +222,41 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
224 drm_gem_object_unreference(&obj->base); 222 drm_gem_object_unreference(&obj->base);
225 trace_i915_gem_object_create(obj); 223 trace_i915_gem_object_create(obj);
226 224
227 args->handle = handle; 225 *handle_p = handle;
228 return 0; 226 return 0;
229} 227}
230 228
229int
230i915_gem_dumb_create(struct drm_file *file,
231 struct drm_device *dev,
232 struct drm_mode_create_dumb *args)
233{
234 /* have to work out size/pitch and return them */
235 args->pitch = ALIGN(args->width & ((args->bpp + 1) / 8), 64);
236 args->size = args->pitch * args->height;
237 return i915_gem_create(file, dev,
238 args->size, &args->handle);
239}
240
241int i915_gem_dumb_destroy(struct drm_file *file,
242 struct drm_device *dev,
243 uint32_t handle)
244{
245 return drm_gem_handle_delete(file, handle);
246}
247
248/**
249 * Creates a new mm object and returns a handle to it.
250 */
251int
252i915_gem_create_ioctl(struct drm_device *dev, void *data,
253 struct drm_file *file)
254{
255 struct drm_i915_gem_create *args = data;
256 return i915_gem_create(file, dev,
257 args->size, &args->handle);
258}
259
231static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj) 260static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
232{ 261{
233 drm_i915_private_t *dev_priv = obj->base.dev->dev_private; 262 drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
@@ -1425,27 +1454,13 @@ i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj)
1425 return tile_height * obj->stride * 2; 1454 return tile_height * obj->stride * 2;
1426} 1455}
1427 1456
1428/**
1429 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
1430 * @dev: DRM device
1431 * @data: GTT mapping ioctl data
1432 * @file: GEM object info
1433 *
1434 * Simply returns the fake offset to userspace so it can mmap it.
1435 * The mmap call will end up in drm_gem_mmap(), which will set things
1436 * up so we can get faults in the handler above.
1437 *
1438 * The fault handler will take care of binding the object into the GTT
1439 * (since it may have been evicted to make room for something), allocating
1440 * a fence register, and mapping the appropriate aperture address into
1441 * userspace.
1442 */
1443int 1457int
1444i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, 1458i915_gem_mmap_gtt(struct drm_file *file,
1445 struct drm_file *file) 1459 struct drm_device *dev,
1460 uint32_t handle,
1461 uint64_t *offset)
1446{ 1462{
1447 struct drm_i915_private *dev_priv = dev->dev_private; 1463 struct drm_i915_private *dev_priv = dev->dev_private;
1448 struct drm_i915_gem_mmap_gtt *args = data;
1449 struct drm_i915_gem_object *obj; 1464 struct drm_i915_gem_object *obj;
1450 int ret; 1465 int ret;
1451 1466
@@ -1456,7 +1471,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1456 if (ret) 1471 if (ret)
1457 return ret; 1472 return ret;
1458 1473
1459 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); 1474 obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1460 if (obj == NULL) { 1475 if (obj == NULL) {
1461 ret = -ENOENT; 1476 ret = -ENOENT;
1462 goto unlock; 1477 goto unlock;
@@ -1479,7 +1494,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1479 goto out; 1494 goto out;
1480 } 1495 }
1481 1496
1482 args->offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT; 1497 *offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT;
1483 1498
1484out: 1499out:
1485 drm_gem_object_unreference(&obj->base); 1500 drm_gem_object_unreference(&obj->base);
@@ -1488,6 +1503,34 @@ unlock:
1488 return ret; 1503 return ret;
1489} 1504}
1490 1505
1506/**
1507 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
1508 * @dev: DRM device
1509 * @data: GTT mapping ioctl data
1510 * @file: GEM object info
1511 *
1512 * Simply returns the fake offset to userspace so it can mmap it.
1513 * The mmap call will end up in drm_gem_mmap(), which will set things
1514 * up so we can get faults in the handler above.
1515 *
1516 * The fault handler will take care of binding the object into the GTT
1517 * (since it may have been evicted to make room for something), allocating
1518 * a fence register, and mapping the appropriate aperture address into
1519 * userspace.
1520 */
1521int
1522i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1523 struct drm_file *file)
1524{
1525 struct drm_i915_gem_mmap_gtt *args = data;
1526
1527 if (!(dev->driver->driver_features & DRIVER_GEM))
1528 return -ENODEV;
1529
1530 return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
1531}
1532
1533
1491static int 1534static int
1492i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj, 1535i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
1493 gfp_t gfpmask) 1536 gfp_t gfpmask)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 56c48b67ef3d..a4605362c528 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -288,6 +288,15 @@ int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
288 uint64_t *gpu_addr); 288 uint64_t *gpu_addr);
289void radeon_gem_object_unpin(struct drm_gem_object *obj); 289void radeon_gem_object_unpin(struct drm_gem_object *obj);
290 290
291int radeon_mode_dumb_create(struct drm_file *file_priv,
292 struct drm_device *dev,
293 struct drm_mode_create_dumb *args);
294int radeon_mode_dumb_mmap(struct drm_file *filp,
295 struct drm_device *dev,
296 uint32_t handle, uint64_t *offset_p);
297int radeon_mode_dumb_destroy(struct drm_file *file_priv,
298 struct drm_device *dev,
299 uint32_t handle);
291 300
292/* 301/*
293 * GART structures, functions & helpers 302 * GART structures, functions & helpers
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 275b26a708d6..ca1b7d4c1d83 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -84,6 +84,16 @@ extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc,
84extern struct drm_ioctl_desc radeon_ioctls_kms[]; 84extern struct drm_ioctl_desc radeon_ioctls_kms[];
85extern int radeon_max_kms_ioctl; 85extern int radeon_max_kms_ioctl;
86int radeon_mmap(struct file *filp, struct vm_area_struct *vma); 86int radeon_mmap(struct file *filp, struct vm_area_struct *vma);
87int radeon_mode_dumb_mmap(struct drm_file *filp,
88 struct drm_device *dev,
89 uint32_t handle, uint64_t *offset_p);
90int radeon_mode_dumb_create(struct drm_file *file_priv,
91 struct drm_device *dev,
92 struct drm_mode_create_dumb *args);
93int radeon_mode_dumb_destroy(struct drm_file *file_priv,
94 struct drm_device *dev,
95 uint32_t handle);
96
87#if defined(CONFIG_DEBUG_FS) 97#if defined(CONFIG_DEBUG_FS)
88int radeon_debugfs_init(struct drm_minor *minor); 98int radeon_debugfs_init(struct drm_minor *minor);
89void radeon_debugfs_cleanup(struct drm_minor *minor); 99void radeon_debugfs_cleanup(struct drm_minor *minor);
@@ -322,6 +332,9 @@ static struct drm_driver kms_driver = {
322 .gem_init_object = radeon_gem_object_init, 332 .gem_init_object = radeon_gem_object_init,
323 .gem_free_object = radeon_gem_object_free, 333 .gem_free_object = radeon_gem_object_free,
324 .dma_ioctl = radeon_dma_ioctl_kms, 334 .dma_ioctl = radeon_dma_ioctl_kms,
335 .dumb_create = radeon_mode_dumb_create,
336 .dumb_map_offset = radeon_mode_dumb_mmap,
337 .dumb_destroy = radeon_mode_dumb_destroy,
325 .fops = { 338 .fops = {
326 .owner = THIS_MODULE, 339 .owner = THIS_MODULE,
327 .open = drm_open, 340 .open = drm_open,
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 66324b5bb5ba..cb968f997ce7 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -64,7 +64,7 @@ static struct fb_ops radeonfb_ops = {
64}; 64};
65 65
66 66
67static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled) 67int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled)
68{ 68{
69 int aligned = width; 69 int aligned = width;
70 int align_large = (ASIC_IS_AVIVO(rdev)) || tiled; 70 int align_large = (ASIC_IS_AVIVO(rdev)) || tiled;
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}
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 6794cdf91f28..c3f23f6ff60e 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -675,4 +675,5 @@ void radeon_fb_output_poll_changed(struct radeon_device *rdev);
675 675
676void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id); 676void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id);
677 677
678int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled);
678#endif 679#endif
diff --git a/include/drm/drm.h b/include/drm/drm.h
index e5f70617dec5..8598cc94e169 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -701,6 +701,10 @@ struct drm_gem_open {
701#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip) 701#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
702#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd) 702#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
703 703
704#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
705#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb)
706#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
707
704/** 708/**
705 * Device specific ioctls should only be in their respective headers 709 * Device specific ioctls should only be in their respective headers
706 * The device specific ioctl range is from 0x40 to 0x99. 710 * The device specific ioctl range is from 0x40 to 0x99.
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index fe29aadb129d..3cbe7a02d2aa 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -880,6 +880,17 @@ struct drm_driver {
880 /* vga arb irq handler */ 880 /* vga arb irq handler */
881 void (*vgaarb_irq)(struct drm_device *dev, bool state); 881 void (*vgaarb_irq)(struct drm_device *dev, bool state);
882 882
883 /* dumb alloc support */
884 int (*dumb_create)(struct drm_file *file_priv,
885 struct drm_device *dev,
886 struct drm_mode_create_dumb *args);
887 int (*dumb_map_offset)(struct drm_file *file_priv,
888 struct drm_device *dev, uint32_t handle,
889 uint64_t *offset);
890 int (*dumb_destroy)(struct drm_file *file_priv,
891 struct drm_device *dev,
892 uint32_t handle);
893
883 /* Driver private ops for this object */ 894 /* Driver private ops for this object */
884 struct vm_operations_struct *gem_vm_ops; 895 struct vm_operations_struct *gem_vm_ops;
885 896
@@ -1544,6 +1555,7 @@ drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
1544int drm_gem_handle_create(struct drm_file *file_priv, 1555int drm_gem_handle_create(struct drm_file *file_priv,
1545 struct drm_gem_object *obj, 1556 struct drm_gem_object *obj,
1546 u32 *handlep); 1557 u32 *handlep);
1558int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
1547 1559
1548static inline void 1560static inline void
1549drm_gem_object_handle_reference(struct drm_gem_object *obj) 1561drm_gem_object_handle_reference(struct drm_gem_object *obj)
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 801be59f4f15..080a6e33470e 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -798,4 +798,11 @@ extern int drm_add_modes_noedid(struct drm_connector *connector,
798extern bool drm_edid_is_valid(struct edid *edid); 798extern bool drm_edid_is_valid(struct edid *edid);
799struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, 799struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
800 int hsize, int vsize, int fresh); 800 int hsize, int vsize, int fresh);
801
802extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
803 void *data, struct drm_file *file_priv);
804extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
805 void *data, struct drm_file *file_priv);
806extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
807 void *data, struct drm_file *file_priv);
801#endif /* __DRM_CRTC_H__ */ 808#endif /* __DRM_CRTC_H__ */
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h
index 0fc7397c8f1f..ae6b7a3dbec7 100644
--- a/include/drm/drm_mode.h
+++ b/include/drm/drm_mode.h
@@ -344,4 +344,33 @@ struct drm_mode_crtc_page_flip {
344 __u64 user_data; 344 __u64 user_data;
345}; 345};
346 346
347/* create a dumb scanout buffer */
348struct drm_mode_create_dumb {
349 uint32_t height;
350 uint32_t width;
351 uint32_t bpp;
352 uint32_t flags;
353 /* handle, pitch, size will be returned */
354 uint32_t handle;
355 uint32_t pitch;
356 uint64_t size;
357};
358
359/* set up for mmap of a dumb scanout buffer */
360struct drm_mode_map_dumb {
361 /** Handle for the object being mapped. */
362 __u32 handle;
363 __u32 pad;
364 /**
365 * Fake offset to use for subsequent mmap call
366 *
367 * This is a fixed-size type for 32/64 compatibility.
368 */
369 __u64 offset;
370};
371
372struct drm_mode_destroy_dumb {
373 uint32_t handle;
374};
375
347#endif 376#endif