aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2014-03-01 18:56:17 -0500
committerChristian König <christian.koenig@amd.com>2014-03-03 04:53:01 -0500
commitbda72d58a20120aee1f78eb17d7eddb955d6696b (patch)
tree41ee4790a9f6a92c8817f2d98ef49cc31f32338b
parent14a9579ddbf15dd1992a9481a4ec80b0b91656d5 (diff)
drm/radeon: add a way to get and set initial buffer domains v2
When passing buffers between processes, the receiving process needs to know the original buffer domain, so that it doesn't accidentally move the buffer. v2: reserve the buffer Signed-off-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-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.c3
-rw-r--r--include/uapi/drm/radeon_drm.h12
6 files changed, 57 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 1ac3393bab66..c20d88c93940 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -456,6 +456,7 @@ struct radeon_bo {
456 /* Protected by gem.mutex */ 456 /* Protected by gem.mutex */
457 struct list_head list; 457 struct list_head list;
458 /* Protected by tbo.reserved */ 458 /* Protected by tbo.reserved */
459 u32 initial_domain;
459 u32 placements[3]; 460 u32 placements[3];
460 struct ttm_placement placement; 461 struct ttm_placement placement;
461 struct ttm_buffer_object tbo; 462 struct ttm_buffer_object tbo;
@@ -2116,6 +2117,8 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
2116 struct drm_file *filp); 2117 struct drm_file *filp);
2117int radeon_gem_va_ioctl(struct drm_device *dev, void *data, 2118int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
2118 struct drm_file *filp); 2119 struct drm_file *filp);
2120int radeon_gem_op_ioctl(struct drm_device *dev, void *data,
2121 struct drm_file *filp);
2119int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 2122int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
2120int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data, 2123int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
2121 struct drm_file *filp); 2124 struct drm_file *filp);
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 84a1bbb75f91..4392b7c95ee6 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -79,9 +79,10 @@
79 * 2.35.0 - Add CIK macrotile mode array query 79 * 2.35.0 - Add CIK macrotile mode array query
80 * 2.36.0 - Fix CIK DCE tiling setup 80 * 2.36.0 - Fix CIK DCE tiling setup
81 * 2.37.0 - allow GS ring setup on r6xx/r7xx 81 * 2.37.0 - allow GS ring setup on r6xx/r7xx
82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN)
82 */ 83 */
83#define KMS_DRIVER_MAJOR 2 84#define KMS_DRIVER_MAJOR 2
84#define KMS_DRIVER_MINOR 37 85#define KMS_DRIVER_MINOR 38
85#define KMS_DRIVER_PATCHLEVEL 0 86#define KMS_DRIVER_PATCHLEVEL 0
86int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 87int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
87int radeon_driver_unload_kms(struct drm_device *dev); 88int 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 b96c819024b3..9863ca742494 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -533,6 +533,42 @@ out:
533 return r; 533 return r;
534} 534}
535 535
536int radeon_gem_op_ioctl(struct drm_device *dev, void *data,
537 struct drm_file *filp)
538{
539 struct drm_radeon_gem_op *args = data;
540 struct drm_gem_object *gobj;
541 struct radeon_bo *robj;
542 int r;
543
544 gobj = drm_gem_object_lookup(dev, filp, args->handle);
545 if (gobj == NULL) {
546 return -ENOENT;
547 }
548 robj = gem_to_radeon_bo(gobj);
549 r = radeon_bo_reserve(robj, false);
550 if (unlikely(r))
551 goto out;
552
553 switch (args->op) {
554 case RADEON_GEM_OP_GET_INITIAL_DOMAIN:
555 args->value = robj->initial_domain;
556 break;
557 case RADEON_GEM_OP_SET_INITIAL_DOMAIN:
558 robj->initial_domain = args->value & (RADEON_GEM_DOMAIN_VRAM |
559 RADEON_GEM_DOMAIN_GTT |
560 RADEON_GEM_DOMAIN_CPU);
561 break;
562 default:
563 r = -EINVAL;
564 }
565
566 radeon_bo_unreserve(robj);
567out:
568 drm_gem_object_unreference_unlocked(gobj);
569 return r;
570}
571
536int radeon_mode_dumb_create(struct drm_file *file_priv, 572int radeon_mode_dumb_create(struct drm_file *file_priv,
537 struct drm_device *dev, 573 struct drm_device *dev,
538 struct drm_mode_create_dumb *args) 574 struct drm_mode_create_dumb *args)
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index baff98be65b1..0b631ebeeb18 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -814,5 +814,6 @@ const struct drm_ioctl_desc radeon_ioctls_kms[] = {
814 DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 814 DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
815 DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 815 DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
816 DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 816 DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
817 DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
817}; 818};
818int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); 819int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms);
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 08595cf90b01..dd12bb4025ac 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -145,6 +145,9 @@ int radeon_bo_create(struct radeon_device *rdev,
145 bo->surface_reg = -1; 145 bo->surface_reg = -1;
146 INIT_LIST_HEAD(&bo->list); 146 INIT_LIST_HEAD(&bo->list);
147 INIT_LIST_HEAD(&bo->va); 147 INIT_LIST_HEAD(&bo->va);
148 bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM |
149 RADEON_GEM_DOMAIN_GTT |
150 RADEON_GEM_DOMAIN_CPU);
148 radeon_ttm_placement_from_domain(bo, domain); 151 radeon_ttm_placement_from_domain(bo, domain);
149 /* Kernel allocation are uninterruptible */ 152 /* Kernel allocation are uninterruptible */
150 down_read(&rdev->pm.mclk_lock); 153 down_read(&rdev->pm.mclk_lock);
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index 1cf18b4a39ec..cb5c93a4c266 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -510,6 +510,7 @@ typedef struct {
510#define DRM_RADEON_GEM_GET_TILING 0x29 510#define DRM_RADEON_GEM_GET_TILING 0x29
511#define DRM_RADEON_GEM_BUSY 0x2a 511#define DRM_RADEON_GEM_BUSY 0x2a
512#define DRM_RADEON_GEM_VA 0x2b 512#define DRM_RADEON_GEM_VA 0x2b
513#define DRM_RADEON_GEM_OP 0x2c
513 514
514#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) 515#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
515#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) 516#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
@@ -552,6 +553,7 @@ typedef struct {
552#define DRM_IOCTL_RADEON_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) 553#define DRM_IOCTL_RADEON_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
553#define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy) 554#define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
554#define DRM_IOCTL_RADEON_GEM_VA DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va) 555#define DRM_IOCTL_RADEON_GEM_VA DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va)
556#define DRM_IOCTL_RADEON_GEM_OP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_OP, struct drm_radeon_gem_op)
555 557
556typedef struct drm_radeon_init { 558typedef struct drm_radeon_init {
557 enum { 559 enum {
@@ -884,6 +886,16 @@ struct drm_radeon_gem_pwrite {
884 uint64_t data_ptr; 886 uint64_t data_ptr;
885}; 887};
886 888
889/* Sets or returns a value associated with a buffer. */
890struct drm_radeon_gem_op {
891 uint32_t handle; /* buffer */
892 uint32_t op; /* RADEON_GEM_OP_* */
893 uint64_t value; /* input or return value */
894};
895
896#define RADEON_GEM_OP_GET_INITIAL_DOMAIN 0
897#define RADEON_GEM_OP_SET_INITIAL_DOMAIN 1
898
887#define RADEON_VA_MAP 1 899#define RADEON_VA_MAP 1
888#define RADEON_VA_UNMAP 2 900#define RADEON_VA_UNMAP 2
889 901