aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_irq.c
diff options
context:
space:
mode:
authorEgbert Eich <eich@suse.de>2012-10-13 07:36:14 -0400
committerDave Airlie <airlied@redhat.com>2012-11-20 01:07:49 -0500
commit0355cf3a0f49e26f4b84d9da7189b2324cf1df6d (patch)
treee0693690f5c6633c7be9a967914e0d5dd83fe743 /drivers/gpu/drm/drm_irq.c
parenta4f968d8e50cb7810e08ebb9bf4c8f2b769fdac7 (diff)
DRM/KMS: Add Bail-Out Conditions for Loop.
When trying to obtain an accurate timestamp for the last vsync interrupt in vblank_disable_and_save() we loop until the vsync counter after reading the time stamp is identical to the one before. In the case where no hardware timestamp can be obtained there is probably no point in trying to make sure we remain within the same vsync during the time we obtain the counter. Furthermore we should make sure there's an 'emergency exit' so that we don't end up in an endless loop when the driver get_vblank_timestamp() function doesn't manage to return within the same vsync. This may happen when this function prints out debugging information over a slow (ie serial) line. Signed-off-by: Egbert Eich <eich@suse.de> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
-rw-r--r--drivers/gpu/drm/drm_irq.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index c0f0046d807..2ba9d7fac34 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -106,6 +106,7 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
106 s64 diff_ns; 106 s64 diff_ns;
107 int vblrc; 107 int vblrc;
108 struct timeval tvblank; 108 struct timeval tvblank;
109 int count = DRM_TIMESTAMP_MAXRETRIES;
109 110
110 /* Prevent vblank irq processing while disabling vblank irqs, 111 /* Prevent vblank irq processing while disabling vblank irqs,
111 * so no updates of timestamps or count can happen after we've 112 * so no updates of timestamps or count can happen after we've
@@ -131,7 +132,10 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
131 do { 132 do {
132 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc); 133 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc);
133 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0); 134 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0);
134 } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc)); 135 } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc);
136
137 if (!count)
138 vblrc = 0;
135 139
136 /* Compute time difference to stored timestamp of last vblank 140 /* Compute time difference to stored timestamp of last vblank
137 * as updated by last invocation of drm_handle_vblank() in vblank irq. 141 * as updated by last invocation of drm_handle_vblank() in vblank irq.