On 2019-07-26 11:06 p.m., Sam Ravnborg wrote:
DRM_WAIT_ON() is from the deprecated drm_os_linux header and the modern replacement is the wait_event_*.
The return values differ, so a conversion is needed to keep the original interface towards userspace. Introduced a switch/case to make code obvious.
Analysis from Michel Dänzer:
The waiting condition rely on all relevant places where vblank_count is modified calls wake_up(&vblank->queue).
drm_handle_vblank():
- Calls wake_up(&vblank->queue)
drm_vblank_enable():
- There is no need here because there can be no sleeping waiters in the queue, because vblank->enabled == false immediately terminates any waits.
drm_crtc_accurate_vblank_count():
- This is called from interrupt handlers, at least from amdgpu_dm.c:dm_pflip_high_irq(). Not sure it needs to wake up the queue though, the driver should call drm_(crtc_)_handle_vblank anyway.
drm_vblank_disable_and_save():
- It can be called from an interrupt, via drm_handle_vblank -> vblank_disable_fn. However, the only place where drm_vblank_disable_and_save can be called with sleeping waiters in the queue is in drm_crtc_vblank_off, which wakes up the queue afterwards (which terminates all waits, because vblank->enabled == false at this point).
v3:
- Added analysis to changelog from Michel Dänzer
- Moved return result handling inside if (req_seq != seq) (Daniel V)
- Reused more of the former logic - resulting in simpler code
- Dropped Reviewed-by from Sean Paul as this is a new implmentation
v2:
- Fix so the case where req_seq equals seq was handled properly
- quick hack to check if IGT became happy
- Only sent to igt, not to dri-devel
Signed-off-by: Sam Ravnborg sam@ravnborg.org Cc: "Michel Dänzer" michel@daenzer.net Cc: Sean Paul sean@poorly.run Cc: Maarten Lankhorst maarten.lankhorst@linux.intel.com Cc: Maxime Ripard maxime.ripard@bootlin.com Cc: David Airlie airlied@linux.ie Cc: Daniel Vetter daniel@ffwll.ch
Reviewed-by: Michel Dänzer michel.daenzer@amd.com