aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2011-08-07 16:39:04 -0400
committerDave Airlie <airlied@redhat.com>2011-08-31 14:25:48 -0400
commitd3ed74027f1dd197b7e08247a40d3bf9be1852b0 (patch)
tree9d4fbd62d8fb5d505c1b934f13bccb762ab47dff /drivers
parentdfadbbdb57b3f2bb33e14f129a43047c6f0caefa (diff)
drm/radeon/kms: add a new gem_wait ioctl with read/write flags
The new DRM_RADEON_GEM_WAIT ioctl combines GEM_WAIT_IDLE and GEM_BUSY (there is a NO_WAIT flag to get the latter) with USAGE_READ and USAGE_WRITE flags to take advantage of the new ttm_bo_wait changes. Also bump the DRM version. Signed-off-by: Marek Olšák <maraeo@gmail.com> Reviewed-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c5
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c36
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.h4
6 files changed, 44 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 32807baf55e2..0040d28816f1 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1143,6 +1143,8 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
1143 struct drm_file *filp); 1143 struct drm_file *filp);
1144int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data, 1144int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
1145 struct drm_file *filp); 1145 struct drm_file *filp);
1146int radeon_gem_wait_ioctl(struct drm_device *dev, void *data,
1147 struct drm_file *filp);
1146 1148
1147/* VRAM scratch page for HDP bug */ 1149/* VRAM scratch page for HDP bug */
1148struct r700_vram_scratch { 1150struct r700_vram_scratch {
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 14e853151105..f0b9066abc5c 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -80,7 +80,10 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
80 p->relocs[i].lobj.wdomain = r->write_domain; 80 p->relocs[i].lobj.wdomain = r->write_domain;
81 p->relocs[i].lobj.rdomain = r->read_domains; 81 p->relocs[i].lobj.rdomain = r->read_domains;
82 p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo; 82 p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo;
83 p->relocs[i].lobj.tv.usage = TTM_USAGE_READWRITE; 83 if (r->read_domains)
84 p->relocs[i].lobj.tv.usage |= TTM_USAGE_READ;
85 if (r->write_domain)
86 p->relocs[i].lobj.tv.usage |= TTM_USAGE_WRITE;
84 p->relocs[i].handle = r->handle; 87 p->relocs[i].handle = r->handle;
85 p->relocs[i].flags = r->flags; 88 p->relocs[i].flags = r->flags;
86 radeon_bo_list_add_object(&p->relocs[i].lobj, 89 radeon_bo_list_add_object(&p->relocs[i].lobj,
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index e71d2ed7fa11..bd187e097e77 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -52,9 +52,10 @@
52 * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query 52 * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query
53 * 2.10.0 - fusion 2D tiling 53 * 2.10.0 - fusion 2D tiling
54 * 2.11.0 - backend map, initial compute support for the CS checker 54 * 2.11.0 - backend map, initial compute support for the CS checker
55 * 2.12.0 - DRM_RADEON_GEM_WAIT ioctl
55 */ 56 */
56#define KMS_DRIVER_MAJOR 2 57#define KMS_DRIVER_MAJOR 2
57#define KMS_DRIVER_MINOR 11 58#define KMS_DRIVER_MINOR 12
58#define KMS_DRIVER_PATCHLEVEL 0 59#define KMS_DRIVER_PATCHLEVEL 0
59int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 60int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
60int radeon_driver_unload_kms(struct drm_device *dev); 61int radeon_driver_unload_kms(struct drm_device *dev);
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index aa1ca2dea42f..2edc2a40d4d7 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -122,7 +122,7 @@ int radeon_gem_set_domain(struct drm_gem_object *gobj,
122 } 122 }
123 if (domain == RADEON_GEM_DOMAIN_CPU) { 123 if (domain == RADEON_GEM_DOMAIN_CPU) {
124 /* Asking for cpu access wait for object idle */ 124 /* Asking for cpu access wait for object idle */
125 r = radeon_bo_wait(robj, NULL, false); 125 r = radeon_bo_wait(robj, NULL, false, TTM_USAGE_READWRITE);
126 if (r) { 126 if (r) {
127 printk(KERN_ERR "Failed to wait for object !\n"); 127 printk(KERN_ERR "Failed to wait for object !\n");
128 return r; 128 return r;
@@ -273,7 +273,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
273 return -ENOENT; 273 return -ENOENT;
274 } 274 }
275 robj = gem_to_radeon_bo(gobj); 275 robj = gem_to_radeon_bo(gobj);
276 r = radeon_bo_wait(robj, &cur_placement, true); 276 r = radeon_bo_wait(robj, &cur_placement, true, TTM_USAGE_READWRITE);
277 switch (cur_placement) { 277 switch (cur_placement) {
278 case TTM_PL_VRAM: 278 case TTM_PL_VRAM:
279 args->domain = RADEON_GEM_DOMAIN_VRAM; 279 args->domain = RADEON_GEM_DOMAIN_VRAM;
@@ -303,7 +303,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
303 return -ENOENT; 303 return -ENOENT;
304 } 304 }
305 robj = gem_to_radeon_bo(gobj); 305 robj = gem_to_radeon_bo(gobj);
306 r = radeon_bo_wait(robj, NULL, false); 306 r = radeon_bo_wait(robj, NULL, false, TTM_USAGE_READWRITE);
307 /* callback hw specific functions if any */ 307 /* callback hw specific functions if any */
308 if (robj->rdev->asic->ioctl_wait_idle) 308 if (robj->rdev->asic->ioctl_wait_idle)
309 robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); 309 robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
@@ -311,6 +311,36 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
311 return r; 311 return r;
312} 312}
313 313
314int radeon_gem_wait_ioctl(struct drm_device *dev, void *data,
315 struct drm_file *filp)
316{
317 struct drm_radeon_gem_wait *args = data;
318 struct drm_gem_object *gobj;
319 struct radeon_bo *robj;
320 bool no_wait = (args->flags & RADEON_GEM_NO_WAIT) != 0;
321 enum ttm_buffer_usage usage = 0;
322 int r;
323
324 if (args->flags & RADEON_GEM_USAGE_READ)
325 usage |= TTM_USAGE_READ;
326 if (args->flags & RADEON_GEM_USAGE_WRITE)
327 usage |= TTM_USAGE_WRITE;
328 if (!usage)
329 usage = TTM_USAGE_READWRITE;
330
331 gobj = drm_gem_object_lookup(dev, filp, args->handle);
332 if (gobj == NULL) {
333 return -ENOENT;
334 }
335 robj = gem_to_radeon_bo(gobj);
336 r = radeon_bo_wait(robj, NULL, no_wait, usage);
337 /* callback hw specific functions if any */
338 if (!no_wait && robj->rdev->asic->ioctl_wait_idle)
339 robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
340 drm_gem_object_unreference_unlocked(gobj);
341 return r;
342}
343
314int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data, 344int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
315 struct drm_file *filp) 345 struct drm_file *filp)
316{ 346{
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index be2c1224e68a..a749c262663f 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -451,5 +451,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
451 DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED), 451 DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED),
452 DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED), 452 DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED),
453 DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED), 453 DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED),
454 DRM_IOCTL_DEF_DRV(RADEON_GEM_WAIT, radeon_gem_wait_ioctl, DRM_AUTH|DRM_UNLOCKED),
454}; 455};
455int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); 456int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms);
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index e9dc8b249c5f..a057a8e5a6e6 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -119,7 +119,7 @@ static inline u64 radeon_bo_mmap_offset(struct radeon_bo *bo)
119} 119}
120 120
121static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type, 121static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
122 bool no_wait) 122 bool no_wait, enum ttm_buffer_usage usage)
123{ 123{
124 int r; 124 int r;
125 125
@@ -130,7 +130,7 @@ static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
130 if (mem_type) 130 if (mem_type)
131 *mem_type = bo->tbo.mem.mem_type; 131 *mem_type = bo->tbo.mem.mem_type;
132 if (bo->tbo.sync_obj) 132 if (bo->tbo.sync_obj)
133 r = ttm_bo_wait(&bo->tbo, true, true, no_wait, TTM_USAGE_READWRITE); 133 r = ttm_bo_wait(&bo->tbo, true, true, no_wait, usage);
134 spin_unlock(&bo->tbo.bdev->fence_lock); 134 spin_unlock(&bo->tbo.bdev->fence_lock);
135 ttm_bo_unreserve(&bo->tbo); 135 ttm_bo_unreserve(&bo->tbo);
136 return r; 136 return r;