[PATCH v14 2/4] drm: crc: Wait for a frame before returning from open()

Daniel Vetter daniel at ffwll.ch
Thu Jan 5 14:14:02 UTC 2017


On Mon, Jan 02, 2017 at 01:59:10PM +0100, Tomeu Vizoso wrote:
> Don't return from the open() call on the crc/data file until the HW has
> produced a first frame, as there's great variability in when the HW is
> able to do that and userspace shouldn't have to guess when this specific
> HW is ready to start giving frame CRCs.
> 
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>

Merged the first 2, I guess the 2 i915 patches need to wait for Dave to be
back so that we can resync the trees ...
-Daniel

> ---
> 
>  drivers/gpu/drm/drm_debugfs_crc.c | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_debugfs_crc.c b/drivers/gpu/drm/drm_debugfs_crc.c
> index 68b171af237b..8b0eeeed4d78 100644
> --- a/drivers/gpu/drm/drm_debugfs_crc.c
> +++ b/drivers/gpu/drm/drm_debugfs_crc.c
> @@ -125,6 +125,12 @@ static const struct file_operations drm_crtc_crc_control_fops = {
>  	.write = crc_control_write
>  };
>  
> +static int crtc_crc_data_count(struct drm_crtc_crc *crc)
> +{
> +	assert_spin_locked(&crc->lock);
> +	return CIRC_CNT(crc->head, crc->tail, DRM_CRC_ENTRIES_NR);
> +}
> +
>  static int crtc_crc_open(struct inode *inode, struct file *filep)
>  {
>  	struct drm_crtc *crtc = inode->i_private;
> @@ -160,8 +166,19 @@ static int crtc_crc_open(struct inode *inode, struct file *filep)
>  	crc->entries = entries;
>  	crc->values_cnt = values_cnt;
>  	crc->opened = true;
> +
> +	/*
> +	 * Only return once we got a first frame, so userspace doesn't have to
> +	 * guess when this particular piece of HW will be ready to start
> +	 * generating CRCs.
> +	 */
> +	ret = wait_event_interruptible_lock_irq(crc->wq,
> +						crtc_crc_data_count(crc),
> +						crc->lock);
>  	spin_unlock_irq(&crc->lock);
>  
> +	WARN_ON(ret);
> +
>  	return 0;
>  
>  err_disable:
> @@ -189,12 +206,6 @@ static int crtc_crc_release(struct inode *inode, struct file *filep)
>  	return 0;
>  }
>  
> -static int crtc_crc_data_count(struct drm_crtc_crc *crc)
> -{
> -	assert_spin_locked(&crc->lock);
> -	return CIRC_CNT(crc->head, crc->tail, DRM_CRC_ENTRIES_NR);
> -}
> -
>  /*
>   * 1 frame field of 10 chars plus a number of CRC fields of 10 chars each, space
>   * separated, with a newline at the end and null-terminated.
> -- 
> 2.9.3
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list