drm/core: Add drm_accurate_vblank_count_and_time.
Subsystems (2)
Maarten Lankhorst
maintainerPATCH 1/1 drm/core: Add drm_accurate_vblank_count_and_time.
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.
---
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(-)
drivers/gpu/drm/drm_irq.c +67 -23
@@ -155,24 +155,10 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipespin_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); }/*
include/drm/drmP.h +2 -0
@@ -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,
Signature · 6 lines
2.1.0 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Patchwork
CI✗ Fi.CI.BAT: failure for drm/core: Add drm_accurate_vblank_count_and_time.
== Series Details ==
== 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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 8 lines · Maarten Lankhorst
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_startchecks 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();
Quoted 153 lines
Cc Mario Kleiner <[email protected]>Cc Ville Syrjälä <[email protected]>Signed-off-by Maarten Lankhorst <[email protected]>---
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(-)drivers/gpu/drm/drm_irq.c +67
-23@@ -155,24 +155,10 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipespin_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); }/* include/drm/drmP.h +2
-0@@ -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,Signature · 1 line
2.1.0
Signature · 6 lines
Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Maarten Lankhorst
maintainerOp 30-03-16 om 15:13 schreef Ville Syrjälä:
Quoted 9 lines · Maarten Lankhorst
Quoted 8 lines
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_startchecks 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.
Quoted 7 lines
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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 10 lines · Maarten Lankhorst
Op 30-03-16 om 15:13 schreef Ville Syrjälä:
Quoted 9 lines · Maarten Lankhorst
Quoted 8 lines
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_startchecks 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.
Quoted 8 lines
Quoted 7 lines
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.
Quoted 4 lines
This is why I call
drm_vblank_count_and_time, and then interpolate as ifupdate_vblank_countwas called on the result.~Maarten
Signature · 6 lines
Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Maarten Lankhorst
maintainerPATCH v2 1/1 drm/core: Add drm_accurate_vblank_count_and_time, v2.
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.
--- drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++ include/drm/drmP.h | 2 ++ 2 files changed, 33 insertions(+)
drivers/gpu/drm/drm_irq.c +31 -0
@@ -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
include/drm/drmP.h +2 -0
@@ -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,
Signature · 7 lines
2.1.0 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
Quoted 36 lines · Maarten Lankhorst
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_startchecks 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:
- Takevblank_time_lockand don't usedrm_vblank_count_and_time.Cc Mario Kleiner <[email protected]>Cc Ville Syrjälä <[email protected]>Signed-off-by Maarten Lankhorst <[email protected]>--- drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++ include/drm/drmP.h | 2 ++ 2 files changed, 33 insertions(+)drivers/gpu/drm/drm_irq.c +8
-0@@ -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.
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 323
Quoted 10 lines
drivers/gpu/drm/drm_irq.c +10
-0+*/ + +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.
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 329
Quoted 6 lines
drivers/gpu/drm/drm_irq.c +6
-0+ +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?
Quoted 26 lines
drivers/gpu/drm/drm_irq.c +7
-0+ +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 include/drm/drmP.h +2
-0@@ -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,Signature · 1 line
2.1.0
Signature · 6 lines
Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Maarten Lankhorst
maintainerRe: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
Op 11-04-16 om 16:43 schreef Ville Syrjälä:
Quoted 50 lines · Maarten Lankhorst
Quoted 36 lines
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_startchecks 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:
- Takevblank_time_lockand don't usedrm_vblank_count_and_time.Cc Mario Kleiner <[email protected]>Cc Ville Syrjälä <[email protected]>Signed-off-by Maarten Lankhorst <[email protected]>--- drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++ include/drm/drmP.h | 2 ++ 2 files changed, 33 insertions(+)drivers/gpu/drm/drm_irq.c +8
-0@@ -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. drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 323
Quoted 10 lines
drivers/gpu/drm/drm_irq.c +10
-0+*/ + +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.
Quoted 8 lines
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 329
Quoted 6 lines
drivers/gpu/drm/drm_irq.c +6
-0+ +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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2] drm/core: Add drm_accurate_vblank_count_and_time, v2.
Quoted 59 lines · Maarten Lankhorst
Op 11-04-16 om 16:43 schreef Ville Syrjälä:
Quoted 50 lines · Maarten Lankhorst
Quoted 36 lines
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_startchecks 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:
- Takevblank_time_lockand don't usedrm_vblank_count_and_time.Cc Mario Kleiner <[email protected]>Cc Ville Syrjälä <[email protected]>Signed-off-by Maarten Lankhorst <[email protected]>--- drivers/gpu/drm/drm_irq.c | 31 +++++++++++++++++++++++++++++++ include/drm/drmP.h | 2 ++ 2 files changed, 33 insertions(+)drivers/gpu/drm/drm_irq.c +8
-0@@ -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. drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 323
Quoted 10 lines
drivers/gpu/drm/drm_irq.c +10
-0+*/ + +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.
Quoted 8 lines
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 329
Quoted 6 lines
drivers/gpu/drm/drm_irq.c +6
-0+ +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?
Quoted 1 line
No, I guess allowing a NULL pointer for
tv_retmight help.
Or just killing the entire parameter.
Signature · 6 lines
Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Maarten Lankhorst
maintainerPATCH v3 1/1 drm/core: Add drm_accurate_vblank_count, v3.
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.
---
drivers/gpu/drm/drm_irq.c +26 -0
@@ -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
include/drm/drmP.h +1 -0
@@ -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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3.
Quoted 29 lines · Maarten Lankhorst
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_startchecks 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:
- Takevblank_time_lockand don't usedrm_vblank_count_and_time. Changes since v2:
- Don't return time of last vblank.Cc Mario Kleiner <[email protected]>Cc Ville Syrjälä <[email protected]>Signed-off-by Maarten Lankhorst <[email protected]>---
drivers/gpu/drm/drm_irq.c +3
-0@@ -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
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 318
Quoted 10 lines
drivers/gpu/drm/drm_irq.c +10
-0+* @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.
drivers/gpu/drm/drm_irq.c static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, · line 323
Quoted 5 lines
drivers/gpu/drm/drm_irq.c +5
-0+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.
Quoted 23 lines
drivers/gpu/drm/drm_irq.c +8
-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 include/drm/drmP.h +1
-0@@ -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,
Signature · 6 lines
Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
kbuild test robot
build botRe: [Intel-gfx] [PATCH v3] drm/core: Add drm_accurate_vblank_count, v3.
In reply to Maarten LankhorstAll warnings (new ones prefixed by >>):
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
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel