drm: omapdrm: Let the DRM core skip plane commit on inactive CRTCs
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 6 Jun 2016 01:25:04 +0000 (04:25 +0300)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 19 Dec 2016 09:24:58 +0000 (11:24 +0200)
The DRM core supports skipping plane update for inactive CRTCs for
hardware that don't need it or can't cope with it. That's our case, and
the driver already skips flushing planes on inactice CRTCs.

We can't remove the check from the driver, as active CRTCs are disabled
at the hardware level when an atomic flush is performed if a mode set is
pending. There's however no need to forward the plane commit calls to
the driver, so use the DRM core infrastructure to skip them with a
detailed comment to explain why the check must still be kept in the
driver.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/omapdrm/omap_crtc.c
drivers/gpu/drm/omapdrm/omap_drv.c

index 42c3b44f9689367300d1dd2f48ca5b504b87ed88..2832dbffd87334b3ecb6c960f5ee8f33037b5a6f 100644 (file)
@@ -414,7 +414,13 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
                dispc_mgr_set_gamma(omap_crtc->channel, lut, length);
        }
 
-       /* Only flush the CRTC if it is currently enabled. */
+       /*
+        * Only flush the CRTC if it is currently enabled. CRTCs that require a
+        * mode set are disabled prior plane updates and enabled afterwards.
+        * They are thus not active (regardless of what their CRTC core state
+        * reports) and the DRM core could thus call this function even though
+        * the CRTC is currently disabled. Do nothing in that case.
+        */
        if (!omap_crtc->enabled)
                return;
 
index 6faba13c8e4144d622a013387b73ae0051cdf24e..0a2d461d62cfcce41b57186ec6200fa9e3fc6695 100644 (file)
@@ -96,7 +96,8 @@ static void omap_atomic_complete(struct omap_atomic_state_commit *commit)
        dispc_runtime_get();
 
        drm_atomic_helper_commit_modeset_disables(dev, old_state);
-       drm_atomic_helper_commit_planes(dev, old_state, 0);
+       drm_atomic_helper_commit_planes(dev, old_state,
+                                       DRM_PLANE_COMMIT_ACTIVE_ONLY);
        drm_atomic_helper_commit_modeset_enables(dev, old_state);
 
        omap_atomic_wait_for_completion(dev, old_state);