aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_drv.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2017-08-23 05:19:02 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2017-08-23 05:22:12 -0400
commitfc5cc9678e130196012c17b37e555d53d3d3476b (patch)
tree30e63d00c084397b66502dc63232cf30de73f765 /drivers/gpu/drm/omapdrm/omap_drv.c
parent0c43f1e02598d304d4cfb06187305445c8207675 (diff)
drm/omap: work-around for omap3 display enable
Seems that on omap3 enabling a crtc without any planes causes a sync lost flood. This only happens on the first enable, and after that it works. This looks like an HW issue and it's unclear why this is happening or how to fix it. This started happening after 897145d0c7010b4e07fa9bc674b1dfb9a2c6fff9 ("drm/omapdrm: Move commit_modeset_enables() before commit_planes()") which, as a work-around, changed omapdrm first to do the modeset enable, and plane set only after that. This WA should be fine on all DSS versions, but apparently OMAP3 DSS is an exception. This patch reverts that work-around for OMAP3 DSS. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 9b3c36b48356..cdf5b0601eba 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -84,23 +84,36 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state)
84 /* Apply the atomic update. */ 84 /* Apply the atomic update. */
85 drm_atomic_helper_commit_modeset_disables(dev, old_state); 85 drm_atomic_helper_commit_modeset_disables(dev, old_state);
86 86
87 /* With the current dss dispc implementation we have to enable 87 if (priv->omaprev != 0x3430) {
88 * the new modeset before we can commit planes. The dispc ovl 88 /* With the current dss dispc implementation we have to enable
89 * configuration relies on the video mode configuration been 89 * the new modeset before we can commit planes. The dispc ovl
90 * written into the HW when the ovl configuration is 90 * configuration relies on the video mode configuration been
91 * calculated. 91 * written into the HW when the ovl configuration is
92 * 92 * calculated.
93 * This approach is not ideal because after a mode change the 93 *
94 * plane update is executed only after the first vblank 94 * This approach is not ideal because after a mode change the
95 * interrupt. The dispc implementation should be fixed so that 95 * plane update is executed only after the first vblank
96 * it is able use uncommitted drm state information. 96 * interrupt. The dispc implementation should be fixed so that
97 */ 97 * it is able use uncommitted drm state information.
98 drm_atomic_helper_commit_modeset_enables(dev, old_state); 98 */
99 omap_atomic_wait_for_completion(dev, old_state); 99 drm_atomic_helper_commit_modeset_enables(dev, old_state);
100 100 omap_atomic_wait_for_completion(dev, old_state);
101 drm_atomic_helper_commit_planes(dev, old_state, 0); 101
102 102 drm_atomic_helper_commit_planes(dev, old_state, 0);
103 drm_atomic_helper_commit_hw_done(old_state); 103
104 drm_atomic_helper_commit_hw_done(old_state);
105 } else {
106 /*
107 * OMAP3 DSS seems to have issues with the work-around above,
108 * resulting in endless sync losts if a crtc is enabled without
109 * a plane. For now, skip the WA for OMAP3.
110 */
111 drm_atomic_helper_commit_planes(dev, old_state, 0);
112
113 drm_atomic_helper_commit_modeset_enables(dev, old_state);
114
115 drm_atomic_helper_commit_hw_done(old_state);
116 }
104 117
105 /* 118 /*
106 * Wait for completion of the page flips to ensure that old buffers 119 * Wait for completion of the page flips to ensure that old buffers