UPSTREAM: drm/rockchip: explain why we can't wait_for_vblanks
authorJohn Keeping <john@metanate.com>
Tue, 19 Jan 2016 10:47:00 +0000 (10:47 +0000)
committerMark Yao <mark.yao@rock-chips.com>
Thu, 17 Mar 2016 01:42:05 +0000 (09:42 +0800)
Change-Id: I073cf5b91554a293009a121845ac1bf3b6b3e6ce
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
Signed-off-by: John Keeping <john@metanate.com>
(cherry picked from commit c9ad1d9946e849ac3d8821d91e136d7fd728dec5)

drivers/gpu/drm/rockchip/rockchip_drm_fb.c

index f706d393f04a4aa62421d2908e027ad1cacaef7a..f1631e3dd3d9602a0d725b5d30e18d5d7d0bb4aa 100644 (file)
@@ -176,6 +176,21 @@ static void rockchip_crtc_wait_for_update(struct drm_crtc *crtc)
                crtc_funcs->wait_for_update(crtc);
 }
 
+/*
+ * We can't use drm_atomic_helper_wait_for_vblanks() because rk3288 and rk3066
+ * have hardware counters for neither vblanks nor scanlines, which results in
+ * a race where:
+ *                             | <-- HW vsync irq and reg take effect
+ *            plane_commit --> |
+ *     get_vblank and wait --> |
+ *                             | <-- handle_vblank, vblank->count + 1
+ *              cleanup_fb --> |
+ *             iommu crash --> |
+ *                             | <-- HW vsync irq and reg take effect
+ *
+ * This function is equivalent but uses rockchip_crtc_wait_for_update() instead
+ * of waiting for vblank_count to change.
+ */
 static void
 rockchip_atomic_wait_for_complete(struct drm_device *dev, struct drm_atomic_state *old_state)
 {