In drm_wait_one_vblank() add a delay when we're "cold". Interrupts aren't
authorkettenis <kettenis@openbsd.org>
Thu, 13 Sep 2018 09:32:27 +0000 (09:32 +0000)
committerkettenis <kettenis@openbsd.org>
Thu, 13 Sep 2018 09:32:27 +0000 (09:32 +0000)
enabled at that point, so we cannot wait for one to happen.  But having no
delay at all breaks detection of some output connectors.

Thanks to Philippe Meunier for tracking down the issue.

ok millert@, jsg@

sys/dev/pci/drm/drm_irq.c

index dd8474f..cbb8042 100644 (file)
@@ -1317,8 +1317,21 @@ void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
        int ret;
        u32 last;
 
-       if (WARN_ON(pipe >= dev->num_crtcs) || cold)
+       if (WARN_ON(pipe >= dev->num_crtcs))
+               return;
+
+#ifdef __OpenBSD__
+       /*
+        * If we're cold, vblank interrupts won't happen even if
+        * they're turned on by the driver.  Just stall long enough
+        * for a vblank to pass.  This assumes a vrefresh of at least
+        * 25 Hz.
+        */
+       if (cold) {
+               delay(40000);
                return;
+       }
+#endif
 
        ret = drm_vblank_get(dev, pipe);
        if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret))