* [PATCH] drm/core: Add drm_accurate_vblank_count_and_time.
@ 2016-03-29 13:38 Maarten Lankhorst
2016-03-29 15:13 ` ✗ Fi.CI.BAT: failure for " Patchwork
2016-03-30 13:13 ` [PATCH] " Ville Syrjälä
0 siblings, 2 replies; 12+ messages in thread
From: Maarten Lankhorst @ 2016-03-29 13:38 UTC (permalink / raw)
To: dri-devel; +Cc: intel-gfx
This function is useful for gen2 intel devices which have no frame
counter, but need a way to determine the current vblank count without
racing with the vblank interrupt handler.
intel_pipe_update_start checks if no vblank interrupt will occur
during vblank evasion, but cannot check whether the vblank handler has
run to completion. This function uses the timestamps to determine
when the last vblank has happened, and interpolates from there.
Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
Unfortunately only compile time tested, I don't have a gen2 to test with.
drivers/gpu/drm/drm_irq.c | 90 +++++++++++++++++++++++++++++++++++------------
include/drm/drmP.h | 2 ++
2 files changed, 69 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 881c5a6c180c..44d8f9607ccd 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -155,24 +155,10 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe
spin_unlock(&dev->vblank_time_lock);
}
-/**
- * drm_update_vblank_count - update the master vblank counter
- * @dev: DRM device
- * @pipe: counter to update
- *
- * Call back into the driver to update the appropriate vblank counter
- * (specified by @pipe). Deal with wraparound, if it occurred, and
- * update the last read value so we can deal with wraparound on the next
- * call if necessary.
- *
- * Only necessary when going from off->on, to account for frames we
- * didn't get an interrupt for.
- *
- * Note: caller must hold dev->vbl_lock since this reads & writes
- * device vblank fields.
- */
-static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
- unsigned long flags)
+static u32 __drm_accurate_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
+ const struct timeval *t_old,
+ unsigned long flags, u32 *pdiff,
+ struct timeval *tv_ret)
{
struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
u32 cur_vblank, diff;
@@ -202,10 +188,8 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
/* trust the hw counter when it's around */
diff = (cur_vblank - vblank->last) & dev->max_vblank_count;
} else if (rc && framedur_ns) {
- const struct timeval *t_old;
u64 diff_ns;
- t_old = &vblanktimestamp(dev, pipe, vblank->count);
diff_ns = timeval_to_ns(&t_vblank) - timeval_to_ns(t_old);
/*
@@ -286,9 +270,13 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
" current=%u, diff=%u, hw=%u hw_last=%u\n",
pipe, vblank->count, diff, cur_vblank, vblank->last);
+ *pdiff = diff;
+ *tv_ret = t_vblank;
+
if (diff == 0) {
WARN_ON_ONCE(cur_vblank != vblank->last);
- return;
+
+ return cur_vblank;
}
/*
@@ -298,9 +286,65 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
* for now, to mark the vblanktimestamp as invalid.
*/
if (!rc && (flags & DRM_CALLED_FROM_VBLIRQ) == 0)
- t_vblank = (struct timeval) {0, 0};
+ *tv_ret = (struct timeval) {0, 0};
+
+ return cur_vblank;
+}
+
+/**
+ * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
+ * @crtc: which counter to retrieve
+ * @tv_ret: last time counter was updated
+ *
+ * This function is similar to @drm_update_vblank_count_and_time but
+ * this function interpolates to handle a race with vblank irq's, and
+ * is only useful for crtc's that have no hw vblank counter.
+ */
+
+u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
+ struct timeval *tv_ret)
+{
+ struct drm_device *dev = crtc->dev;
+ u32 pdiff, old_vblank;
+ struct timeval tv_old = {};
+
+ WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
+
+ old_vblank = drm_crtc_vblank_count_and_time(crtc, &tv_old);
+
+ __drm_accurate_vblank_count_and_time(dev, drm_crtc_index(crtc),
+ &tv_old, 0, &pdiff, tv_ret);
+
+ return old_vblank + pdiff;
+}
+EXPORT_SYMBOL(drm_accurate_vblank_count_and_time);
+
+/**
+ * drm_update_vblank_count - update the master vblank counter
+ * @dev: DRM device
+ * @pipe: counter to update
+ *
+ * Call back into the driver to update the appropriate vblank counter
+ * (specified by @pipe). Deal with wraparound, if it occurred, and
+ * update the last read value so we can deal with wraparound on the next
+ * call if necessary.
+ *
+ * Only necessary when going from off->on, to account for frames we
+ * didn't get an interrupt for.
+ *
+ * Note: caller must hold dev->vbl_lock since this reads & writes
+ * device vblank fields.
+ */
+static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
+ unsigned long flags)
+{
+ u32 diff, cur_vblank, old_vblank = dev->vblank[pipe].count;
+ struct timeval t_vblank;
+ const struct timeval *tv_old = &vblanktimestamp(dev, pipe, old_vblank);
- store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
+ cur_vblank = __drm_accurate_vblank_count_and_time(dev, pipe, tv_old, flags, &diff, &t_vblank);
+ if (diff)
+ store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
}
/*
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 31483c2fef51..1df65922c7c6 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -995,6 +995,8 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
extern void drm_vblank_cleanup(struct drm_device *dev);
+extern u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
+ struct timeval *tv_ret);
extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* ✗ Fi.CI.BAT: failure for drm/core: Add drm_accurate_vblank_count_and_time.
2016-03-29 13:38 [PATCH] drm/core: Add drm_accurate_vblank_count_and_time Maarten Lankhorst
@ 2016-03-29 15:13 ` Patchwork
2016-03-30 13:13 ` [PATCH] " Ville Syrjälä
1 sibling, 0 replies; 12+ messages in thread
From: Patchwork @ 2016-03-29 15:13 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx
== Series Details ==
Series: drm/core: Add drm_accurate_vblank_count_and_time.
URL : https://patchwork.freedesktop.org/series/4990/
State : failure
== Summary ==
Series 4990v1 drm/core: Add drm_accurate_vblank_count_and_time.
http://patchwork.freedesktop.org/api/1.0/series/4990/revisions/1/mbox/
Test drv_module_reload_basic:
dmesg-warn -> DMESG-FAIL (snb-x220t)
Test gem_ctx_switch:
Subgroup basic-default:
pass -> FAIL (bdw-ultra)
Test gem_exec_nop:
Subgroup basic:
fail -> PASS (snb-x220t)
pass -> FAIL (bdw-ultra)
Test gem_exec_suspend:
Subgroup basic-s3:
fail -> DMESG-FAIL (bsw-nuc-2)
Subgroup basic-s4:
skip -> FAIL (bdw-ultra)
Test gem_exec_whisper:
Subgroup basic:
pass -> FAIL (bdw-ultra)
Test gem_mmap_gtt:
Subgroup basic-read-write-distinct:
incomplete -> PASS (snb-x220t)
Test gem_sync:
Subgroup basic-all:
fail -> PASS (snb-x220t)
pass -> FAIL (bdw-ultra)
Subgroup basic-blt:
pass -> FAIL (bdw-ultra)
Subgroup basic-bsd:
pass -> FAIL (bdw-ultra)
Subgroup basic-default:
pass -> FAIL (bdw-ultra)
Subgroup basic-render:
pass -> FAIL (bdw-ultra) UNSTABLE
Subgroup basic-vebox:
pass -> FAIL (bdw-ultra)
Test kms_force_connector_basic:
Subgroup force-connector-state:
pass -> SKIP (ivb-t430s)
Test kms_pipe_crc_basic:
Subgroup suspend-read-crc-pipe-c:
dmesg-fail -> SKIP (snb-x220t)
Test pm_rpm:
Subgroup basic-rte:
dmesg-warn -> PASS (byt-nuc) UNSTABLE
Test prime_self_import:
Subgroup basic-with_fd_dup:
incomplete -> PASS (snb-x220t)
bdw-nuci7 total:195 pass:181 dwarn:1 dfail:0 fail:1 skip:12
bdw-ultra total:195 pass:162 dwarn:1 dfail:0 fail:12 skip:20
bsw-nuc-2 total:195 pass:156 dwarn:1 dfail:1 fail:0 skip:37
byt-nuc total:195 pass:158 dwarn:1 dfail:0 fail:1 skip:35
hsw-brixbox total:195 pass:171 dwarn:1 dfail:0 fail:1 skip:22
hsw-gt2 total:195 pass:176 dwarn:1 dfail:0 fail:1 skip:17
ilk-hp8440p total:195 pass:129 dwarn:1 dfail:0 fail:1 skip:64
ivb-t430s total:195 pass:167 dwarn:1 dfail:0 fail:1 skip:26
skl-i7k-2 total:195 pass:170 dwarn:1 dfail:0 fail:1 skip:23
skl-nuci5 total:195 pass:182 dwarn:1 dfail:0 fail:1 skip:11
snb-dellxps total:195 pass:159 dwarn:1 dfail:0 fail:1 skip:34
snb-x220t total:195 pass:159 dwarn:0 dfail:1 fail:2 skip:33
Results at /archive/results/CI_IGT_test/Patchwork_1733/
2702045fbd4188c1c26bd890bc43976fd10937ad drm-intel-nightly: 2016y-03m-29d-12h-21m-19s UTC integration manifest
9c51d854ef151e2e089a62e311ee719c8b40cd24 drm/core: Add drm_accurate_vblank_count_and_time.
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] drm/core: Add drm_accurate_vblank_count_and_time.
2016-03-29 13:38 [PATCH] drm/core: Add drm_accurate_vblank_count_and_time Maarten Lankhorst
2016-03-29 15:13 ` ✗ Fi.CI.BAT: failure for " Patchwork
@ 2016-03-30 13:13 ` Ville Syrjälä
2016-03-30 13:41 ` Maarten Lankhorst
1 sibling, 1 reply; 12+ messages in thread
From: Ville Syrjälä @ 2016-03-30 13:13 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx, dri-devel
On Tue, Mar 29, 2016 at 03:38:55PM +0200, Maarten Lankhorst wrote:
> This function is useful for gen2 intel devices which have no frame
> counter, but need a way to determine the current vblank count without
> racing with the vblank interrupt handler.
>
> intel_pipe_update_start checks if no vblank interrupt will occur
> during vblank evasion, but cannot check whether the vblank handler has
> run to completion. This function uses the timestamps to determine
> when the last vblank has happened, and interpolates from there.
Didn't really read it in detail, but on a glance it seems too
complicated to me. All we should really need is something like this:
drm_vblank_get();
drm_update_vblank_count();
accurate = drm_vblank_count();
>
> Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> Unfortunately only compile time tested, I don't have a gen2 to test with.
>
> drivers/gpu/drm/drm_irq.c | 90 +++++++++++++++++++++++++++++++++++------------
> include/drm/drmP.h | 2 ++
> 2 files changed, 69 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 881c5a6c180c..44d8f9607ccd 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -155,24 +155,10 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe
> spin_unlock(&dev->vblank_time_lock);
> }
>
> -/**
> - * drm_update_vblank_count - update the master vblank counter
> - * @dev: DRM device
> - * @pipe: counter to update
> - *
> - * Call back into the driver to update the appropriate vblank counter
> - * (specified by @pipe). Deal with wraparound, if it occurred, and
> - * update the last read value so we can deal with wraparound on the next
> - * call if necessary.
> - *
> - * Only necessary when going from off->on, to account for frames we
> - * didn't get an interrupt for.
> - *
> - * Note: caller must hold dev->vbl_lock since this reads & writes
> - * device vblank fields.
> - */
> -static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> - unsigned long flags)
> +static u32 __drm_accurate_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
> + const struct timeval *t_old,
> + unsigned long flags, u32 *pdiff,
> + struct timeval *tv_ret)
> {
> struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
> u32 cur_vblank, diff;
> @@ -202,10 +188,8 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> /* trust the hw counter when it's around */
> diff = (cur_vblank - vblank->last) & dev->max_vblank_count;
> } else if (rc && framedur_ns) {
> - const struct timeval *t_old;
> u64 diff_ns;
>
> - t_old = &vblanktimestamp(dev, pipe, vblank->count);
> diff_ns = timeval_to_ns(&t_vblank) - timeval_to_ns(t_old);
>
> /*
> @@ -286,9 +270,13 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> " current=%u, diff=%u, hw=%u hw_last=%u\n",
> pipe, vblank->count, diff, cur_vblank, vblank->last);
>
> + *pdiff = diff;
> + *tv_ret = t_vblank;
> +
> if (diff == 0) {
> WARN_ON_ONCE(cur_vblank != vblank->last);
> - return;
> +
> + return cur_vblank;
> }
>
> /*
> @@ -298,9 +286,65 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> * for now, to mark the vblanktimestamp as invalid.
> */
> if (!rc && (flags & DRM_CALLED_FROM_VBLIRQ) == 0)
> - t_vblank = (struct timeval) {0, 0};
> + *tv_ret = (struct timeval) {0, 0};
> +
> + return cur_vblank;
> +}
> +
> +/**
> + * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
> + * @crtc: which counter to retrieve
> + * @tv_ret: last time counter was updated
> + *
> + * This function is similar to @drm_update_vblank_count_and_time but
> + * this function interpolates to handle a race with vblank irq's, and
> + * is only useful for crtc's that have no hw vblank counter.
> + */
> +
> +u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
> + struct timeval *tv_ret)
> +{
> + struct drm_device *dev = crtc->dev;
> + u32 pdiff, old_vblank;
> + struct timeval tv_old = {};
> +
> + WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
> +
> + old_vblank = drm_crtc_vblank_count_and_time(crtc, &tv_old);
> +
> + __drm_accurate_vblank_count_and_time(dev, drm_crtc_index(crtc),
> + &tv_old, 0, &pdiff, tv_ret);
> +
> + return old_vblank + pdiff;
> +}
> +EXPORT_SYMBOL(drm_accurate_vblank_count_and_time);
> +
> +/**
> + * drm_update_vblank_count - update the master vblank counter
> + * @dev: DRM device
> + * @pipe: counter to update
> + *
> + * Call back into the driver to update the appropriate vblank counter
> + * (specified by @pipe). Deal with wraparound, if it occurred, and
> + * update the last read value so we can deal with wraparound on the next
> + * call if necessary.
> + *
> + * Only necessary when going from off->on, to account for frames we
> + * didn't get an interrupt for.
> + *
> + * Note: caller must hold dev->vbl_lock since this reads & writes
> + * device vblank fields.
> + */
> +static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> + unsigned long flags)
> +{
> + u32 diff, cur_vblank, old_vblank = dev->vblank[pipe].count;
> + struct timeval t_vblank;
> + const struct timeval *tv_old = &vblanktimestamp(dev, pipe, old_vblank);
>
> - store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
> + cur_vblank = __drm_accurate_vblank_count_and_time(dev, pipe, tv_old, flags, &diff, &t_vblank);
> + if (diff)
> + store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
> }
>
> /*
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 31483c2fef51..1df65922c7c6 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -995,6 +995,8 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
> extern void drm_vblank_cleanup(struct drm_device *dev);
> +extern u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
> + struct timeval *tv_ret);
> extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
>
> extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
> --
> 2.1.0
--
Ville Syrjälä
Intel OTC
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] drm/core: Add drm_accurate_vblank_count_and_time.
2016-03-30 13:13 ` [PATCH] " Ville Syrjälä
@ 2016-03-30 13:41 ` Maarten Lankhorst
2016-03-30 13:45 ` Ville Syrjälä
0 siblings, 1 reply; 12+ messages in thread
From: Maarten Lankhorst @ 2016-03-30 13:41 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, dri-devel
Op 30-03-16 om 15:13 schreef Ville Syrjälä:
> On Tue, Mar 29, 2016 at 03:38:55PM +0200, Maarten Lankhorst wrote:
>> This function is useful for gen2 intel devices which have no frame
>> counter, but need a way to determine the current vblank count without
>> racing with the vblank interrupt handler.
>>
>> intel_pipe_update_start checks if no vblank interrupt will occur
>> during vblank evasion, but cannot check whether the vblank handler has
>> run to completion. This function uses the timestamps to determine
>> when the last vblank has happened, and interpolates from there.
> Didn't really read it in detail, but on a glance it seems too
> complicated to me. All we should really need is something like this:
>
> drm_vblank_get();
> drm_update_vblank_count();
> accurate = drm_vblank_count();
>
Updating from non vblank irq context might cause the vblank clock to drift, or at least contend the vblank lock.
This is why I call drm_vblank_count_and_time, and then interpolate as if update_vblank_count was called on the result.
~Maarten
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] drm/core: Add drm_accurate_vblank_count_and_time.
2016-03-30 13:41 ` Maarten Lankhorst
@ 2016-03-30 13:45 ` Ville Syrjälä
2016-04-11 9:42 ` [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2 Maarten Lankhorst
0 siblings, 1 reply; 12+ messages in thread
From: Ville Syrjälä @ 2016-03-30 13:45 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx, dri-devel
On Wed, Mar 30, 2016 at 03:41:26PM +0200, Maarten Lankhorst wrote:
> Op 30-03-16 om 15:13 schreef Ville Syrjälä:
> > On Tue, Mar 29, 2016 at 03:38:55PM +0200, Maarten Lankhorst wrote:
> >> This function is useful for gen2 intel devices which have no frame
> >> counter, but need a way to determine the current vblank count without
> >> racing with the vblank interrupt handler.
> >>
> >> intel_pipe_update_start checks if no vblank interrupt will occur
> >> during vblank evasion, but cannot check whether the vblank handler has
> >> run to completion. This function uses the timestamps to determine
> >> when the last vblank has happened, and interpolates from there.
> > Didn't really read it in detail, but on a glance it seems too
> > complicated to me. All we should really need is something like this:
> >
> > drm_vblank_get();
> > drm_update_vblank_count();
> > accurate = drm_vblank_count();
> >
> Updating from non vblank irq context might cause the vblank clock to drift, or at least contend the vblank lock.
I don't see a problem. The scanout position is anyway used to fix up the
timestamp.
>
> This is why I call drm_vblank_count_and_time, and then interpolate as if update_vblank_count was called on the result.
>
> ~Maarten
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
2016-03-30 13:45 ` Ville Syrjälä
@ 2016-04-11 9:42 ` Maarten Lankhorst
2016-04-11 14:43 ` Ville Syrjälä
0 siblings, 1 reply; 12+ messages in thread
From: Maarten Lankhorst @ 2016-04-11 9:42 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, dri-devel
This function is useful for gen2 intel devices which have no frame
counter, but need a way to determine the current vblank count without
racing with the vblank interrupt handler.
intel_pipe_update_start checks if no vblank interrupt will occur
during vblank evasion, but cannot check whether the vblank handler has
run to completion. This function uses the timestamps to determine
when the last vblank has happened, and interpolates from there.
Changes since v1:
- Take vblank_time_lock and don't use drm_vblank_count_and_time.
Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++
include/drm/drmP.h | 2 ++
2 files changed, 33 insertions(+)
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 3c1a6f18e71c..d3cecc1932e1 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -303,6 +303,37 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
}
+/**
+ * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
+ * @crtc: which counter to retrieve
+ * @tv_ret: last time counter was updated
+ *
+ * This function is similar to @drm_update_vblank_count_and_time but
+ * this function interpolates to handle a race with vblank irq's, and
+ * is only useful for crtc's that have no hw vblank counter.
+ */
+
+u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
+ struct timeval *tv_ret)
+{
+ struct drm_device *dev = crtc->dev;
+ u32 vblank, pipe = drm_crtc_index(crtc);
+ unsigned long flags;
+
+ WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
+
+ spin_lock_irqsave(&dev->vblank_time_lock, flags);
+ drm_update_vblank_count(dev, pipe, 0);
+
+ vblank = dev->vblank[pipe].count;
+ *tv_ret = vblanktimestamp(dev, pipe, vblank);
+
+ spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
+
+ return vblank;
+}
+EXPORT_SYMBOL(drm_accurate_vblank_count_and_time);
+
/*
* Disable vblank irq's on crtc, make sure that last vblank count
* of hardware and corresponding consistent software vblank counter
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 31483c2fef51..1df65922c7c6 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -995,6 +995,8 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
extern void drm_vblank_cleanup(struct drm_device *dev);
+extern u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
+ struct timeval *tv_ret);
extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
--
2.1.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
2016-04-11 9:42 ` [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2 Maarten Lankhorst
@ 2016-04-11 14:43 ` Ville Syrjälä
2016-04-11 15:06 ` Maarten Lankhorst
0 siblings, 1 reply; 12+ messages in thread
From: Ville Syrjälä @ 2016-04-11 14:43 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx, dri-devel
On Mon, Apr 11, 2016 at 11:42:57AM +0200, Maarten Lankhorst wrote:
> This function is useful for gen2 intel devices which have no frame
> counter, but need a way to determine the current vblank count without
> racing with the vblank interrupt handler.
>
> intel_pipe_update_start checks if no vblank interrupt will occur
> during vblank evasion, but cannot check whether the vblank handler has
> run to completion. This function uses the timestamps to determine
> when the last vblank has happened, and interpolates from there.
>
> Changes since v1:
> - Take vblank_time_lock and don't use drm_vblank_count_and_time.
>
> Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++
> include/drm/drmP.h | 2 ++
> 2 files changed, 33 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 3c1a6f18e71c..d3cecc1932e1 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -303,6 +303,37 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
> }
>
> +/**
> + * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
> + * @crtc: which counter to retrieve
> + * @tv_ret: last time counter was updated
> + *
> + * This function is similar to @drm_update_vblank_count_and_time but
> + * this function interpolates to handle a race with vblank irq's, and
> + * is only useful for crtc's that have no hw vblank counter.
> + */
> +
> +u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
> + struct timeval *tv_ret)
> +{
> + struct drm_device *dev = crtc->dev;
> + u32 vblank, pipe = drm_crtc_index(crtc);
> + unsigned long flags;
> +
> + WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
It's useful on everything if you actually want to trust the
software counter to not be stale.
> +
> + spin_lock_irqsave(&dev->vblank_time_lock, flags);
> + drm_update_vblank_count(dev, pipe, 0);
> +
> + vblank = dev->vblank[pipe].count;
> + *tv_ret = vblanktimestamp(dev, pipe, vblank);
Do we have a user in mind that would care about the timestamp?
> +
> + spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
> +
> + return vblank;
> +}
> +EXPORT_SYMBOL(drm_accurate_vblank_count_and_time);
> +
> /*
> * Disable vblank irq's on crtc, make sure that last vblank count
> * of hardware and corresponding consistent software vblank counter
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 31483c2fef51..1df65922c7c6 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -995,6 +995,8 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
> extern void drm_vblank_cleanup(struct drm_device *dev);
> +extern u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
> + struct timeval *tv_ret);
> extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
>
> extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
> --
> 2.1.0
>
--
Ville Syrjälä
Intel OTC
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
2016-04-11 14:43 ` Ville Syrjälä
@ 2016-04-11 15:06 ` Maarten Lankhorst
2016-04-11 15:17 ` Ville Syrjälä
0 siblings, 1 reply; 12+ messages in thread
From: Maarten Lankhorst @ 2016-04-11 15:06 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, dri-devel
Op 11-04-16 om 16:43 schreef Ville Syrjälä:
> On Mon, Apr 11, 2016 at 11:42:57AM +0200, Maarten Lankhorst wrote:
>> This function is useful for gen2 intel devices which have no frame
>> counter, but need a way to determine the current vblank count without
>> racing with the vblank interrupt handler.
>>
>> intel_pipe_update_start checks if no vblank interrupt will occur
>> during vblank evasion, but cannot check whether the vblank handler has
>> run to completion. This function uses the timestamps to determine
>> when the last vblank has happened, and interpolates from there.
>>
>> Changes since v1:
>> - Take vblank_time_lock and don't use drm_vblank_count_and_time.
>>
>> Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
>> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>> drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++
>> include/drm/drmP.h | 2 ++
>> 2 files changed, 33 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
>> index 3c1a6f18e71c..d3cecc1932e1 100644
>> --- a/drivers/gpu/drm/drm_irq.c
>> +++ b/drivers/gpu/drm/drm_irq.c
>> @@ -303,6 +303,37 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
>> store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
>> }
>>
>> +/**
>> + * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
>> + * @crtc: which counter to retrieve
>> + * @tv_ret: last time counter was updated
>> + *
>> + * This function is similar to @drm_update_vblank_count_and_time but
>> + * this function interpolates to handle a race with vblank irq's, and
>> + * is only useful for crtc's that have no hw vblank counter.
>> + */
>> +
>> +u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
>> + struct timeval *tv_ret)
>> +{
>> + struct drm_device *dev = crtc->dev;
>> + u32 vblank, pipe = drm_crtc_index(crtc);
>> + unsigned long flags;
>> +
>> + WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
> It's useful on everything if you actually want to trust the
> software counter to not be stale.
>
>> +
>> + spin_lock_irqsave(&dev->vblank_time_lock, flags);
>> + drm_update_vblank_count(dev, pipe, 0);
>> +
>> + vblank = dev->vblank[pipe].count;
>> + *tv_ret = vblanktimestamp(dev, pipe, vblank);
> Do we have a user in mind that would care about the timestamp?
>
No, I guess allowing a NULL pointer for tv_ret might help.
~Maarten
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
2016-04-11 15:06 ` Maarten Lankhorst
@ 2016-04-11 15:17 ` Ville Syrjälä
2016-04-12 14:32 ` [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3 Maarten Lankhorst
0 siblings, 1 reply; 12+ messages in thread
From: Ville Syrjälä @ 2016-04-11 15:17 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx, dri-devel
On Mon, Apr 11, 2016 at 05:06:24PM +0200, Maarten Lankhorst wrote:
> Op 11-04-16 om 16:43 schreef Ville Syrjälä:
> > On Mon, Apr 11, 2016 at 11:42:57AM +0200, Maarten Lankhorst wrote:
> >> This function is useful for gen2 intel devices which have no frame
> >> counter, but need a way to determine the current vblank count without
> >> racing with the vblank interrupt handler.
> >>
> >> intel_pipe_update_start checks if no vblank interrupt will occur
> >> during vblank evasion, but cannot check whether the vblank handler has
> >> run to completion. This function uses the timestamps to determine
> >> when the last vblank has happened, and interpolates from there.
> >>
> >> Changes since v1:
> >> - Take vblank_time_lock and don't use drm_vblank_count_and_time.
> >>
> >> Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
> >> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> >> ---
> >> drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++
> >> include/drm/drmP.h | 2 ++
> >> 2 files changed, 33 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> >> index 3c1a6f18e71c..d3cecc1932e1 100644
> >> --- a/drivers/gpu/drm/drm_irq.c
> >> +++ b/drivers/gpu/drm/drm_irq.c
> >> @@ -303,6 +303,37 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> >> store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
> >> }
> >>
> >> +/**
> >> + * drm_accurate_vblank_count_and_time - retrieve the master vblank counter
> >> + * @crtc: which counter to retrieve
> >> + * @tv_ret: last time counter was updated
> >> + *
> >> + * This function is similar to @drm_update_vblank_count_and_time but
> >> + * this function interpolates to handle a race with vblank irq's, and
> >> + * is only useful for crtc's that have no hw vblank counter.
> >> + */
> >> +
> >> +u32 drm_accurate_vblank_count_and_time(struct drm_crtc *crtc,
> >> + struct timeval *tv_ret)
> >> +{
> >> + struct drm_device *dev = crtc->dev;
> >> + u32 vblank, pipe = drm_crtc_index(crtc);
> >> + unsigned long flags;
> >> +
> >> + WARN(dev->max_vblank_count, "This function is only useful when a hw counter is unavailable.");
> > It's useful on everything if you actually want to trust the
> > software counter to not be stale.
> >
> >> +
> >> + spin_lock_irqsave(&dev->vblank_time_lock, flags);
> >> + drm_update_vblank_count(dev, pipe, 0);
> >> +
> >> + vblank = dev->vblank[pipe].count;
> >> + *tv_ret = vblanktimestamp(dev, pipe, vblank);
> > Do we have a user in mind that would care about the timestamp?
> >
> No, I guess allowing a NULL pointer for tv_ret might help.
Or just killing the entire parameter.
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3.
2016-04-11 15:17 ` Ville Syrjälä
@ 2016-04-12 14:32 ` Maarten Lankhorst
2016-04-12 15:03 ` Ville Syrjälä
2016-04-12 16:43 ` [Intel-gfx] " kbuild test robot
0 siblings, 2 replies; 12+ messages in thread
From: Maarten Lankhorst @ 2016-04-12 14:32 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, dri-devel
This function is useful for gen2 intel devices which have no frame
counter, but need a way to determine the current vblank count without
racing with the vblank interrupt handler.
intel_pipe_update_start checks if no vblank interrupt will occur
during vblank evasion, but cannot check whether the vblank handler has
run to completion. This function uses the timestamps to determine
when the last vblank has happened, and interpolates from there.
Changes since v1:
- Take vblank_time_lock and don't use drm_vblank_count_and_time.
Changes since v2:
- Don't return time of last vblank.
Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 3c1a6f18e71c..32bfa4bb8f41 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -303,6 +303,32 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
}
+/**
+ * drm_accurate_vblank_count - retrieve the master vblank counter
+ * @crtc: which counter to retrieve
+ * @tv_ret: last time counter was updated
+ *
+ * This function is similar to @drm_crtc_vblank_count but this
+ * function interpolates to handle a race with vblank irq's.
+ */
+
+u32 drm_accurate_vblank_count(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ u32 vblank, pipe = drm_crtc_index(crtc);
+ unsigned long flags;
+
+ spin_lock_irqsave(&dev->vblank_time_lock, flags);
+
+ drm_update_vblank_count(dev, pipe, 0);
+ vblank = dev->vblank[pipe].count;
+
+ spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
+
+ return vblank;
+}
+EXPORT_SYMBOL(drm_accurate_vblank_count);
+
/*
* Disable vblank irq's on crtc, make sure that last vblank count
* of hardware and corresponding consistent software vblank counter
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 31483c2fef51..747c80da70e5 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -995,6 +995,7 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
extern void drm_vblank_cleanup(struct drm_device *dev);
+extern u32 drm_accurate_vblank_count(struct drm_crtc *crtc);
extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3.
2016-04-12 14:32 ` [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3 Maarten Lankhorst
@ 2016-04-12 15:03 ` Ville Syrjälä
2016-04-12 16:43 ` [Intel-gfx] " kbuild test robot
1 sibling, 0 replies; 12+ messages in thread
From: Ville Syrjälä @ 2016-04-12 15:03 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: intel-gfx, dri-devel
On Tue, Apr 12, 2016 at 04:32:19PM +0200, Maarten Lankhorst wrote:
> This function is useful for gen2 intel devices which have no frame
> counter, but need a way to determine the current vblank count without
> racing with the vblank interrupt handler.
>
> intel_pipe_update_start checks if no vblank interrupt will occur
> during vblank evasion, but cannot check whether the vblank handler has
> run to completion. This function uses the timestamps to determine
> when the last vblank has happened, and interpolates from there.
>
> Changes since v1:
> - Take vblank_time_lock and don't use drm_vblank_count_and_time.
> Changes since v2:
> - Don't return time of last vblank.
>
> Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 3c1a6f18e71c..32bfa4bb8f41 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -303,6 +303,32 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
> store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
> }
>
> +/**
> + * drm_accurate_vblank_count - retrieve the master vblank counter
> + * @crtc: which counter to retrieve
> + * @tv_ret: last time counter was updated
> + *
> + * This function is similar to @drm_crtc_vblank_count but this
> + * function interpolates to handle a race with vblank irq's.
> + */
> +
> +u32 drm_accurate_vblank_count(struct drm_crtc *crtc)
> +{
> + struct drm_device *dev = crtc->dev;
> + u32 vblank, pipe = drm_crtc_index(crtc);
pipe should be 'unsigned int' for consistency.
> + unsigned long flags;
> +
> + spin_lock_irqsave(&dev->vblank_time_lock, flags);
> +
> + drm_update_vblank_count(dev, pipe, 0);
One thing that came to mind is some callers might end up doing the
update twice if the irq wasn't yet enabled when drm_vblank_get() was
called. Eg. drm_wait_one_vblank() might do that. So it might be a bit
more efficient to add a drm_vblank_get_and_update() instead, or something
like that. But I don't really care too much.
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> + vblank = dev->vblank[pipe].count;
> +
> + spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
> +
> + return vblank;
> +}
> +EXPORT_SYMBOL(drm_accurate_vblank_count);
> +
> /*
> * Disable vblank irq's on crtc, make sure that last vblank count
> * of hardware and corresponding consistent software vblank counter
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 31483c2fef51..747c80da70e5 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -995,6 +995,7 @@ extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
> extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
> extern void drm_vblank_cleanup(struct drm_device *dev);
> +extern u32 drm_accurate_vblank_count(struct drm_crtc *crtc);
> extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
>
> extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Intel-gfx] [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3.
2016-04-12 14:32 ` [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3 Maarten Lankhorst
2016-04-12 15:03 ` Ville Syrjälä
@ 2016-04-12 16:43 ` kbuild test robot
1 sibling, 0 replies; 12+ messages in thread
From: kbuild test robot @ 2016-04-12 16:43 UTC (permalink / raw)
To: Maarten Lankhorst; +Cc: dri-devel, intel-gfx, kbuild-all
[-- Attachment #1: Type: text/plain, Size: 25609 bytes --]
Hi Maarten,
[auto build test WARNING on drm/drm-next]
[also build test WARNING on v4.6-rc3 next-20160412]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/Maarten-Lankhorst/drm-core-Add-drm_accurate_vblank_count-v3/20160412-223507
base: git://people.freedesktop.org/~airlied/linux.git drm-next
reproduce: make htmldocs
All warnings (new ones prefixed by >>):
drivers/gpu/drm/i915/i915_irq.c:2663: warning: No description found for parameter 'fmt'
include/drm/drm_crtc.h:364: warning: No description found for parameter 'mode_blob'
include/drm/drm_crtc.h:779: warning: No description found for parameter 'name'
include/drm/drm_crtc.h:1238: warning: No description found for parameter 'connector_id'
include/drm/drm_crtc.h:1238: warning: No description found for parameter 'tile_blob_ptr'
include/drm/drm_crtc.h:1277: warning: No description found for parameter 'rotation'
include/drm/drm_crtc.h:1539: warning: No description found for parameter 'name'
include/drm/drm_crtc.h:1539: warning: No description found for parameter 'mutex'
include/drm/drm_crtc.h:1539: warning: No description found for parameter 'helper_private'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tile_idr'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'connector_ida'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'delayed_event'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'edid_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'dpms_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'path_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tile_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'plane_type_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'rotation_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_src_x'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_src_y'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_src_w'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_src_h'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_crtc_x'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_crtc_y'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_crtc_w'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_crtc_h'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_fb_id'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_crtc_id'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_active'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'prop_mode_id'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'dvi_i_subconnector_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'dvi_i_select_subconnector_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_subconnector_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_select_subconnector_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_mode_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_left_margin_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_right_margin_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_top_margin_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_bottom_margin_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_brightness_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_contrast_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_flicker_reduction_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_overscan_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_saturation_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'tv_hue_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'scaling_mode_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'aspect_ratio_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'dirty_info_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'suggested_x_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'suggested_y_property'
include/drm/drm_crtc.h:2175: warning: No description found for parameter 'allow_fb_modifiers'
drivers/gpu/drm/drm_atomic_helper.c:2924: warning: No description found for parameter 'start'
drivers/gpu/drm/drm_atomic_helper.c:2924: warning: No description found for parameter 'start'
drivers/gpu/drm/drm_atomic_helper.c:2924: warning: No description found for parameter 'start'
drivers/gpu/drm/drm_atomic_helper.c:2924: warning: No description found for parameter 'start'
include/drm/drm_dp_helper.h:749: warning: No description found for parameter 'i2c_nack_count'
include/drm/drm_dp_helper.h:749: warning: No description found for parameter 'i2c_defer_count'
drivers/gpu/drm/drm_dp_mst_topology.c:2356: warning: No description found for parameter 'connector'
include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'cached_edid'
include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'has_audio'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'max_dpcd_transaction_bytes'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'sink_count'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_slots'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'avail_slots'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_pbn'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'qlock'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_msg_downq'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_down_in_progress'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_lock'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'proposed_vcpis'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payloads'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_mask'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'vcpi_mask'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_waitq'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'work'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_work'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_list'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_lock'
include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_work'
drivers/gpu/drm/drm_dp_mst_topology.c:2356: warning: No description found for parameter 'connector'
drivers/gpu/drm/drm_irq.c:176: warning: No description found for parameter 'flags'
>> drivers/gpu/drm/drm_irq.c:316: warning: Excess function parameter 'tv_ret' description in 'drm_accurate_vblank_count'
include/drm/drmP.h:168: warning: No description found for parameter 'fmt'
include/drm/drmP.h:184: warning: No description found for parameter 'fmt'
include/drm/drmP.h:202: warning: No description found for parameter 'fmt'
include/drm/drmP.h:247: warning: No description found for parameter 'dev'
include/drm/drmP.h:247: warning: No description found for parameter 'data'
include/drm/drmP.h:247: warning: No description found for parameter 'file_priv'
include/drm/drmP.h:280: warning: No description found for parameter 'ioctl'
include/drm/drmP.h:280: warning: No description found for parameter '_func'
include/drm/drmP.h:280: warning: No description found for parameter '_flags'
include/drm/drmP.h:362: warning: cannot understand function prototype: 'struct drm_lock_data '
include/drm/drmP.h:415: warning: cannot understand function prototype: 'struct drm_driver '
include/drm/drmP.h:672: warning: cannot understand function prototype: 'struct drm_info_list '
include/drm/drmP.h:682: warning: cannot understand function prototype: 'struct drm_info_node '
include/drm/drmP.h:692: warning: cannot understand function prototype: 'struct drm_minor '
include/drm/drmP.h:740: warning: cannot understand function prototype: 'struct drm_device '
drivers/gpu/drm/i915/intel_runtime_pm.c:2275: warning: No description found for parameter 'resume'
drivers/gpu/drm/i915/intel_runtime_pm.c:2275: warning: No description found for parameter 'resume'
drivers/gpu/drm/i915/i915_irq.c:2663: warning: No description found for parameter 'fmt'
drivers/gpu/drm/i915/i915_irq.c:2663: warning: No description found for parameter 'fmt'
drivers/gpu/drm/i915/i915_irq.c:2663: warning: No description found for parameter 'fmt'
drivers/gpu/drm/i915/i915_irq.c:2663: warning: No description found for parameter 'fmt'
drivers/gpu/drm/i915/i915_gem.c:421: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:421: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:421: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:686: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:686: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:686: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:767: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:767: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:767: warning: No description found for parameter 'args'
drivers/gpu/drm/i915/i915_gem.c:767: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:1029: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:1029: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:1029: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:1245: warning: No description found for parameter 'rps'
drivers/gpu/drm/i915/i915_gem.c:1459: warning: No description found for parameter 'req'
drivers/gpu/drm/i915/i915_gem.c:1494: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:1494: warning: No description found for parameter 'readonly'
drivers/gpu/drm/i915/i915_gem.c:1617: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:1617: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:1617: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:1680: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:1680: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:1680: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:1725: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:1725: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:1725: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:2013: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:2013: warning: No description found for parameter 'size'
drivers/gpu/drm/i915/i915_gem.c:2013: warning: No description found for parameter 'tiling_mode'
drivers/gpu/drm/i915/i915_gem.c:2013: warning: No description found for parameter 'fenced'
drivers/gpu/drm/i915/i915_gem.c:2013: warning: Excess function parameter 'obj' description in 'i915_gem_get_gtt_alignment'
drivers/gpu/drm/i915/i915_gem.c:2911: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_gem.c:3037: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:3087: warning: No description found for parameter 'dev'
drivers/gpu/drm/i915/i915_gem.c:3087: warning: No description found for parameter 'data'
drivers/gpu/drm/i915/i915_gem.c:3087: warning: No description found for parameter 'file'
drivers/gpu/drm/i915/i915_gem.c:3087: warning: Excess function parameter 'DRM_IOCTL_ARGS' description in 'i915_gem_wait_ioctl'
drivers/gpu/drm/i915/i915_gem.c:3459: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:3459: warning: No description found for parameter 'vm'
drivers/gpu/drm/i915/i915_gem.c:3459: warning: No description found for parameter 'ggtt_view'
drivers/gpu/drm/i915/i915_gem.c:3459: warning: No description found for parameter 'alignment'
drivers/gpu/drm/i915/i915_gem.c:3459: warning: No description found for parameter 'flags'
drivers/gpu/drm/i915/i915_gem.c:3714: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:3714: warning: No description found for parameter 'write'
drivers/gpu/drm/i915/i915_gem.c:3789: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:3789: warning: No description found for parameter 'cache_level'
drivers/gpu/drm/i915/i915_gem.c:4063: warning: No description found for parameter 'obj'
drivers/gpu/drm/i915/i915_gem.c:4063: warning: No description found for parameter 'write'
drivers/gpu/drm/i915/i915_cmd_parser.c:748: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:748: warning: Excess function parameter 'ring' description in 'i915_cmd_parser_init_ring'
drivers/gpu/drm/i915/i915_cmd_parser.c:838: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:838: warning: Excess function parameter 'ring' description in 'i915_cmd_parser_fini_ring'
drivers/gpu/drm/i915/i915_cmd_parser.c:1034: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:1034: warning: Excess function parameter 'ring' description in 'i915_needs_cmd_parser'
drivers/gpu/drm/i915/i915_cmd_parser.c:1186: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:1186: warning: Excess function parameter 'ring' description in 'i915_parse_cmds'
drivers/gpu/drm/i915/i915_cmd_parser.c:748: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:748: warning: Excess function parameter 'ring' description in 'i915_cmd_parser_init_ring'
drivers/gpu/drm/i915/i915_cmd_parser.c:838: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:838: warning: Excess function parameter 'ring' description in 'i915_cmd_parser_fini_ring'
drivers/gpu/drm/i915/i915_cmd_parser.c:1034: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:1034: warning: Excess function parameter 'ring' description in 'i915_needs_cmd_parser'
drivers/gpu/drm/i915/i915_cmd_parser.c:1186: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/i915_cmd_parser.c:1186: warning: Excess function parameter 'ring' description in 'i915_parse_cmds'
drivers/gpu/drm/i915/intel_lrc.c:318: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/intel_lrc.c:318: warning: Excess function parameter 'ring' description in 'intel_lr_context_descriptor_update'
drivers/gpu/drm/i915/intel_lrc.c:355: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/intel_lrc.c:355: warning: Excess function parameter 'ring' description in 'intel_execlists_ctx_id'
drivers/gpu/drm/i915/intel_lrc.c:547: warning: No description found for parameter 'engine'
drivers/gpu/drm/i915/intel_lrc.c:547: warning: Excess function parameter 'ring' description in 'intel_lrc_irq_handler'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: No description found for parameter 'params'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'dev' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'file' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'ring' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'ctx' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'batch_obj' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'exec_start' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:951: warning: Excess function parameter 'dispatch_flags' description in 'intel_execlists_submission'
drivers/gpu/drm/i915/intel_lrc.c:1334: warning: No description found for parameter 'engine'
vim +316 drivers/gpu/drm/drm_irq.c
170 *
171 * Note: caller must hold dev->vbl_lock since this reads & writes
172 * device vblank fields.
173 */
174 static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
175 unsigned long flags)
> 176 {
177 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
178 u32 cur_vblank, diff;
179 bool rc;
180 struct timeval t_vblank;
181 int count = DRM_TIMESTAMP_MAXRETRIES;
182 int framedur_ns = vblank->framedur_ns;
183
184 /*
185 * Interrupts were disabled prior to this call, so deal with counter
186 * wrap if needed.
187 * NOTE! It's possible we lost a full dev->max_vblank_count + 1 events
188 * here if the register is small or we had vblank interrupts off for
189 * a long time.
190 *
191 * We repeat the hardware vblank counter & timestamp query until
192 * we get consistent results. This to prevent races between gpu
193 * updating its hardware counter while we are retrieving the
194 * corresponding vblank timestamp.
195 */
196 do {
197 cur_vblank = dev->driver->get_vblank_counter(dev, pipe);
198 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, flags);
199 } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe) && --count > 0);
200
201 if (dev->max_vblank_count != 0) {
202 /* trust the hw counter when it's around */
203 diff = (cur_vblank - vblank->last) & dev->max_vblank_count;
204 } else if (rc && framedur_ns) {
205 const struct timeval *t_old;
206 u64 diff_ns;
207
208 t_old = &vblanktimestamp(dev, pipe, vblank->count);
209 diff_ns = timeval_to_ns(&t_vblank) - timeval_to_ns(t_old);
210
211 /*
212 * Figure out how many vblanks we've missed based
213 * on the difference in the timestamps and the
214 * frame/field duration.
215 */
216 diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
217
218 if (diff == 0 && flags & DRM_CALLED_FROM_VBLIRQ)
219 DRM_DEBUG_VBL("crtc %u: Redundant vblirq ignored."
220 " diff_ns = %lld, framedur_ns = %d)\n",
221 pipe, (long long) diff_ns, framedur_ns);
222 } else {
223 /* some kind of default for drivers w/o accurate vbl timestamping */
224 diff = (flags & DRM_CALLED_FROM_VBLIRQ) != 0;
225 }
226
227 /*
228 * Within a drm_vblank_pre_modeset - drm_vblank_post_modeset
229 * interval? If so then vblank irqs keep running and it will likely
230 * happen that the hardware vblank counter is not trustworthy as it
231 * might reset at some point in that interval and vblank timestamps
232 * are not trustworthy either in that interval. Iow. this can result
233 * in a bogus diff >> 1 which must be avoided as it would cause
234 * random large forward jumps of the software vblank counter.
235 */
236 if (diff > 1 && (vblank->inmodeset & 0x2)) {
237 DRM_DEBUG_VBL("clamping vblank bump to 1 on crtc %u: diffr=%u"
238 " due to pre-modeset.\n", pipe, diff);
239 diff = 1;
240 }
241
242 /*
243 * FIMXE: Need to replace this hack with proper seqlocks.
244 *
245 * Restrict the bump of the software vblank counter to a safe maximum
246 * value of +1 whenever there is the possibility that concurrent readers
247 * of vblank timestamps could be active at the moment, as the current
248 * implementation of the timestamp caching and updating is not safe
249 * against concurrent readers for calls to store_vblank() with a bump
250 * of anything but +1. A bump != 1 would very likely return corrupted
251 * timestamps to userspace, because the same slot in the cache could
252 * be concurrently written by store_vblank() and read by one of those
253 * readers without the read-retry logic detecting the collision.
254 *
255 * Concurrent readers can exist when we are called from the
256 * drm_vblank_off() or drm_vblank_on() functions and other non-vblank-
257 * irq callers. However, all those calls to us are happening with the
258 * vbl_lock locked to prevent drm_vblank_get(), so the vblank refcount
259 * can't increase while we are executing. Therefore a zero refcount at
260 * this point is safe for arbitrary counter bumps if we are called
261 * outside vblank irq, a non-zero count is not 100% safe. Unfortunately
262 * we must also accept a refcount of 1, as whenever we are called from
263 * drm_vblank_get() -> drm_vblank_enable() the refcount will be 1 and
264 * we must let that one pass through in order to not lose vblank counts
265 * during vblank irq off - which would completely defeat the whole
266 * point of this routine.
267 *
268 * Whenever we are called from vblank irq, we have to assume concurrent
269 * readers exist or can show up any time during our execution, even if
270 * the refcount is currently zero, as vblank irqs are usually only
271 * enabled due to the presence of readers, and because when we are called
272 * from vblank irq we can't hold the vbl_lock to protect us from sudden
273 * bumps in vblank refcount. Therefore also restrict bumps to +1 when
274 * called from vblank irq.
275 */
276 if ((diff > 1) && (atomic_read(&vblank->refcount) > 1 ||
277 (flags & DRM_CALLED_FROM_VBLIRQ))) {
278 DRM_DEBUG_VBL("clamping vblank bump to 1 on crtc %u: diffr=%u "
279 "refcount %u, vblirq %u\n", pipe, diff,
280 atomic_read(&vblank->refcount),
281 (flags & DRM_CALLED_FROM_VBLIRQ) != 0);
282 diff = 1;
283 }
284
285 DRM_DEBUG_VBL("updating vblank count on crtc %u:"
286 " current=%u, diff=%u, hw=%u hw_last=%u\n",
287 pipe, vblank->count, diff, cur_vblank, vblank->last);
288
289 if (diff == 0) {
290 WARN_ON_ONCE(cur_vblank != vblank->last);
291 return;
292 }
293
294 /*
295 * Only reinitialize corresponding vblank timestamp if high-precision query
296 * available and didn't fail, or we were called from the vblank interrupt.
297 * Otherwise reinitialize delayed at next vblank interrupt and assign 0
298 * for now, to mark the vblanktimestamp as invalid.
299 */
300 if (!rc && (flags & DRM_CALLED_FROM_VBLIRQ) == 0)
301 t_vblank = (struct timeval) {0, 0};
302
303 store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
304 }
305
306 /**
307 * drm_accurate_vblank_count - retrieve the master vblank counter
308 * @crtc: which counter to retrieve
309 * @tv_ret: last time counter was updated
310 *
311 * This function is similar to @drm_crtc_vblank_count but this
312 * function interpolates to handle a race with vblank irq's.
313 */
314
315 u32 drm_accurate_vblank_count(struct drm_crtc *crtc)
> 316 {
317 struct drm_device *dev = crtc->dev;
318 u32 vblank, pipe = drm_crtc_index(crtc);
319 unsigned long flags;
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 6302 bytes --]
[-- Attachment #3: Type: text/plain, Size: 160 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-04-12 16:43 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-29 13:38 [PATCH] drm/core: Add drm_accurate_vblank_count_and_time Maarten Lankhorst
2016-03-29 15:13 ` ✗ Fi.CI.BAT: failure for " Patchwork
2016-03-30 13:13 ` [PATCH] " Ville Syrjälä
2016-03-30 13:41 ` Maarten Lankhorst
2016-03-30 13:45 ` Ville Syrjälä
2016-04-11 9:42 ` [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2 Maarten Lankhorst
2016-04-11 14:43 ` Ville Syrjälä
2016-04-11 15:06 ` Maarten Lankhorst
2016-04-11 15:17 ` Ville Syrjälä
2016-04-12 14:32 ` [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3 Maarten Lankhorst
2016-04-12 15:03 ` Ville Syrjälä
2016-04-12 16:43 ` [Intel-gfx] " kbuild test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.