[PATCH 1/6] drm/radeon: add a way to get and set initial buffer domains
Marek Olšák
maraeo at gmail.com
Wed Feb 26 02:58:10 PST 2014
I'll send the other patches today.
Marek
On Wed, Feb 26, 2014 at 10:39 AM, Christian König
<deathsimple at vodafone.de> wrote:
> Am 26.02.2014 01:44, schrieb Marek Olšák:
>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> When passing buffers between processes, the receiving process needs to
>> know
>> the original buffer domain, so that it doesn't accidentally move the
>> buffer.
>>
>> Signed-off-by: Marek Olšák <marek.olsak at amd.com>
>
>
> This patch is: Reviewed-by: Christian König <christian.koenig at amd.com>
>
> Where is the rest of the series? At least I didn't got it in my mailbox, and
> I would like to apply it to drm-next-3.15.
>
> Cheers,
> Christian.
>
>
>> ---
>> drivers/gpu/drm/radeon/radeon.h | 3 +++
>> drivers/gpu/drm/radeon/radeon_drv.c | 3 ++-
>> drivers/gpu/drm/radeon/radeon_gem.c | 36
>> ++++++++++++++++++++++++++++++++++
>> drivers/gpu/drm/radeon/radeon_kms.c | 1 +
>> drivers/gpu/drm/radeon/radeon_object.c | 3 +++
>> include/uapi/drm/radeon_drm.h | 12 ++++++++++++
>> 6 files changed, 57 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon.h
>> b/drivers/gpu/drm/radeon/radeon.h
>> index a415f8e..3f10782 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -454,6 +454,7 @@ struct radeon_bo {
>> /* Protected by gem.mutex */
>> struct list_head list;
>> /* Protected by tbo.reserved */
>> + u32 initial_domain;
>> u32 placements[3];
>> struct ttm_placement placement;
>> struct ttm_buffer_object tbo;
>> @@ -2114,6 +2115,8 @@ int radeon_gem_wait_idle_ioctl(struct drm_device
>> *dev, void *data,
>> struct drm_file *filp);
>> int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
>> struct drm_file *filp);
>> +int radeon_gem_op_ioctl(struct drm_device *dev, void *data,
>> + struct drm_file *filp);
>> int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file
>> *filp);
>> int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
>> struct drm_file *filp);
>> diff --git a/drivers/gpu/drm/radeon/radeon_drv.c
>> b/drivers/gpu/drm/radeon/radeon_drv.c
>> index 84a1bbb7..4392b7c 100644
>> --- a/drivers/gpu/drm/radeon/radeon_drv.c
>> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
>> @@ -79,9 +79,10 @@
>> * 2.35.0 - Add CIK macrotile mode array query
>> * 2.36.0 - Fix CIK DCE tiling setup
>> * 2.37.0 - allow GS ring setup on r6xx/r7xx
>> + * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN)
>> */
>> #define KMS_DRIVER_MAJOR 2
>> -#define KMS_DRIVER_MINOR 37
>> +#define KMS_DRIVER_MINOR 38
>> #define KMS_DRIVER_PATCHLEVEL 0
>> int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
>> int 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 b96c819..9863ca7 100644
>> --- a/drivers/gpu/drm/radeon/radeon_gem.c
>> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
>> @@ -533,6 +533,42 @@ out:
>> return r;
>> }
>> +int radeon_gem_op_ioctl(struct drm_device *dev, void *data,
>> + struct drm_file *filp)
>> +{
>> + struct drm_radeon_gem_op *args = data;
>> + struct drm_gem_object *gobj;
>> + struct radeon_bo *robj;
>> + int r;
>> +
>> + gobj = drm_gem_object_lookup(dev, filp, args->handle);
>> + if (gobj == NULL) {
>> + return -ENOENT;
>> + }
>> + robj = gem_to_radeon_bo(gobj);
>> + r = radeon_bo_reserve(robj, false);
>> + if (unlikely(r))
>> + goto out;
>> +
>> + switch (args->op) {
>> + case RADEON_GEM_OP_GET_INITIAL_DOMAIN:
>> + args->value = robj->initial_domain;
>> + break;
>> + case RADEON_GEM_OP_SET_INITIAL_DOMAIN:
>> + robj->initial_domain = args->value &
>> (RADEON_GEM_DOMAIN_VRAM |
>> +
>> RADEON_GEM_DOMAIN_GTT |
>> +
>> RADEON_GEM_DOMAIN_CPU);
>> + break;
>> + default:
>> + r = -EINVAL;
>> + }
>> +
>> + radeon_bo_unreserve(robj);
>> +out:
>> + drm_gem_object_unreference_unlocked(gobj);
>> + return r;
>> +}
>> +
>> int radeon_mode_dumb_create(struct drm_file *file_priv,
>> struct drm_device *dev,
>> 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 baff98b..0b631eb 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[] = {
>> DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING,
>> radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl,
>> DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl,
>> DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> + DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl,
>> DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> };
>> int 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 08595cf..dd12bb4 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,
>> bo->surface_reg = -1;
>> INIT_LIST_HEAD(&bo->list);
>> INIT_LIST_HEAD(&bo->va);
>> + bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM |
>> + RADEON_GEM_DOMAIN_GTT |
>> + RADEON_GEM_DOMAIN_CPU);
>> radeon_ttm_placement_from_domain(bo, domain);
>> /* Kernel allocation are uninterruptible */
>> down_read(&rdev->pm.mclk_lock);
>> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
>> index 1cf18b4..cb5c93a 100644
>> --- a/include/uapi/drm/radeon_drm.h
>> +++ b/include/uapi/drm/radeon_drm.h
>> @@ -510,6 +510,7 @@ typedef struct {
>> #define DRM_RADEON_GEM_GET_TILING 0x29
>> #define DRM_RADEON_GEM_BUSY 0x2a
>> #define DRM_RADEON_GEM_VA 0x2b
>> +#define DRM_RADEON_GEM_OP 0x2c
>> #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE +
>> DRM_RADEON_CP_INIT, drm_radeon_init_t)
>> #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE +
>> DRM_RADEON_CP_START)
>> @@ -552,6 +553,7 @@ typedef struct {
>> #define DRM_IOCTL_RADEON_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE
>> + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
>> #define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE +
>> DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
>> #define DRM_IOCTL_RADEON_GEM_VA DRM_IOWR(DRM_COMMAND_BASE
>> + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va)
>> +#define DRM_IOCTL_RADEON_GEM_OP DRM_IOWR(DRM_COMMAND_BASE
>> + DRM_RADEON_GEM_OP, struct drm_radeon_gem_op)
>> typedef struct drm_radeon_init {
>> enum {
>> @@ -884,6 +886,16 @@ struct drm_radeon_gem_pwrite {
>> uint64_t data_ptr;
>> };
>> +/* Sets or returns a value associated with a buffer. */
>> +struct drm_radeon_gem_op {
>> + uint32_t handle; /* buffer */
>> + uint32_t op; /* RADEON_GEM_OP_* */
>> + uint64_t value; /* input or return value */
>> +};
>> +
>> +#define RADEON_GEM_OP_GET_INITIAL_DOMAIN 0
>> +#define RADEON_GEM_OP_SET_INITIAL_DOMAIN 1
>> +
>> #define RADEON_VA_MAP 1
>> #define RADEON_VA_UNMAP 2
>>
>
>
More information about the dri-devel
mailing list