Message ID | 20170102125912.22305-3-tomeu.vizoso@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
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.
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@collabora.com> --- drivers/gpu/drm/drm_debugfs_crc.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)