[PATCH 2/2] drm/vc4: Add get/set tiling ioctls.

Eric Anholt eric at anholt.net
Thu Jun 15 22:11:26 UTC 2017


Boris Brezillon <boris.brezillon at free-electrons.com> writes:

> Hi Eric,
>
> On Wed,  7 Jun 2017 17:13:36 -0700
> Eric Anholt <eric at anholt.net> wrote:
>
>> This allows mesa to set the tiling format for a BO and have that
>> tiling format be respected by mesa on the other side of an
>> import/export (and by vc4 scanout in the kernel), without defining a
>> protocol to pass the tiling through userspace.
>> 
>> Signed-off-by: Eric Anholt <eric at anholt.net>
>> ---
>> 
>> igt tests (which caught two edge cases) submitted to intel-gfx.
>> 
>> Mesa code: https://github.com/anholt/mesa/commits/drm-vc4-tiling
>> 
>>  drivers/gpu/drm/vc4/vc4_bo.c  | 83 +++++++++++++++++++++++++++++++++++++++++++
>>  drivers/gpu/drm/vc4/vc4_drv.c |  2 ++
>>  drivers/gpu/drm/vc4/vc4_drv.h |  6 ++++
>>  drivers/gpu/drm/vc4/vc4_kms.c | 41 ++++++++++++++++++++-
>>  include/uapi/drm/vc4_drm.h    | 16 +++++++++
>>  5 files changed, 147 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
>> index 80b2f9e55c5c..21649109fd4f 100644
>> --- a/drivers/gpu/drm/vc4/vc4_bo.c
>> +++ b/drivers/gpu/drm/vc4/vc4_bo.c
>> @@ -347,6 +347,7 @@ void vc4_free_object(struct drm_gem_object *gem_bo)
>>  		bo->validated_shader = NULL;
>>  	}
>>  
>> +	bo->t_format = false;
>>  	bo->free_time = jiffies;
>>  	list_add(&bo->size_head, cache_list);
>>  	list_add(&bo->unref_head, &vc4->bo_cache.time_list);
>> @@ -572,6 +573,88 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
>>  	return ret;
>>  }
>>  
>> +/**
>> + * vc4_set_tiling_ioctl() - Sets the tiling modifier for a BO.
>> + * @dev: DRM device
>> + * @data: ioctl argument
>> + * @file_priv: DRM file for this fd
>> + *
>> + * The tiling state of the BO decides the default modifier of an fb if
>> + * no specific modifier was set by userspace, and the return value of
>> + * vc4_get_tiling_ioctl() (so that userspace can treat a BO it
>> + * received from dmabuf as the same tiling format as the producer
>> + * used).
>> + */
>> +int vc4_set_tiling_ioctl(struct drm_device *dev, void *data,
>> +			 struct drm_file *file_priv)
>> +{
>> +	struct drm_vc4_set_tiling *args = data;
>> +	struct drm_gem_object *gem_obj;
>> +	struct vc4_bo *bo;
>> +	bool t_format;
>> +
>> +	if (args->flags != 0)
>> +		return -EINVAL;
>> +
>> +	switch (args->modifier) {
>> +	case DRM_FORMAT_MOD_NONE:
>> +		t_format = false;
>> +		break;
>> +	case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
>> +		t_format = true;
>> +		break;
>> +	default:
>> +		return -EINVAL;
>> +	}
>> +
>> +	gem_obj = drm_gem_object_lookup(file_priv, args->handle);
>> +	if (!gem_obj) {
>> +		DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
>> +		return -ENOENT;
>> +	}
>> +	bo = to_vc4_bo(gem_obj);
>> +	bo->t_format = t_format;
>> +
>> +	drm_gem_object_unreference_unlocked(gem_obj);
>> +
>> +	return 0;
>> +}
>> +
>> +/**
>> + * vc4_get_tiling_ioctl() - Gets the tiling modifier for a BO.
>> + * @dev: DRM device
>> + * @data: ioctl argument
>> + * @file_priv: DRM file for this fd
>> + *
>> + * Returns the tiling modifier for a BO as set by vc4_set_tiling_ioctl().
>> + */
>> +int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,
>> +			 struct drm_file *file_priv)
>> +{
>> +	struct drm_vc4_get_tiling *args = data;
>> +	struct drm_gem_object *gem_obj;
>> +	struct vc4_bo *bo;
>> +
>> +	if (args->flags != 0 || args->modifier != 0)
>> +		return -EINVAL;
>> +
>> +	gem_obj = drm_gem_object_lookup(file_priv, args->handle);
>> +	if (!gem_obj) {
>> +		DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
>> +		return -ENOENT;
>> +	}
>> +	bo = to_vc4_bo(gem_obj);
>> +
>> +	if (bo->t_format)
>> +		args->modifier = DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED;
>> +	else
>> +		args->modifier = DRM_FORMAT_MOD_NONE;
>> +
>> +	drm_gem_object_unreference_unlocked(gem_obj);
>> +
>> +	return 0;
>> +}
>> +
>>  void vc4_bo_cache_init(struct drm_device *dev)
>>  {
>>  	struct vc4_dev *vc4 = to_vc4_dev(dev);
>> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
>> index 136bb4213dc0..c6b487c3d2b7 100644
>> --- a/drivers/gpu/drm/vc4/vc4_drv.c
>> +++ b/drivers/gpu/drm/vc4/vc4_drv.c
>> @@ -138,6 +138,8 @@ static const struct drm_ioctl_desc vc4_drm_ioctls[] = {
>>  	DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
>>  			  DRM_ROOT_ONLY),
>>  	DRM_IOCTL_DEF_DRV(VC4_GET_PARAM, vc4_get_param_ioctl, DRM_RENDER_ALLOW),
>> +	DRM_IOCTL_DEF_DRV(VC4_SET_TILING, vc4_set_tiling_ioctl, DRM_RENDER_ALLOW),
>> +	DRM_IOCTL_DEF_DRV(VC4_GET_TILING, vc4_get_tiling_ioctl, DRM_RENDER_ALLOW),
>>  };
>>  
>>  static struct drm_driver vc4_drm_driver = {
>> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
>> index a5bf2e5e0b57..df22698d62ee 100644
>> --- a/drivers/gpu/drm/vc4/vc4_drv.h
>> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
>> @@ -148,6 +148,8 @@ struct vc4_bo {
>>  	 */
>>  	uint64_t write_seqno;
>>  
>> +	bool t_format;
>> +
>
> Will we need the DRM_VC4_SET/GET_TILING ioctls when importing a BO
> that is using H264 tile mode? If this is the case, we should probably
> store the modifier directly.

I'm not sure.  Whoever is getting buffers from the ISP is going to be
doing the prime import to vc4 for displaying it on a plane, so it seems
about equal complexity ot me to do it either way.  If we're using some
existing dma-buf based media stack, it might support plane modifiers
already, though.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170615/f4502ae7/attachment.sig>


More information about the dri-devel mailing list