drm: rcar-du: Split planes pre-association 4/4 between CRTCs
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 28 Apr 2015 19:00:28 +0000 (22:00 +0300)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Mon, 25 May 2015 12:34:13 +0000 (15:34 +0300)
If we have more than one CRTCs in a group pre-associate planes 0-3 with
CRTC 0 and planes 4-7 with CRTC 1 to minimize flicker occurring when the
association is changed. The pre-association could be controlled by a
module parameter if needed.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
drivers/gpu/drm/rcar-du/rcar_du_crtc.c
drivers/gpu/drm/rcar-du/rcar_du_kms.c

index 620a2c51185cbb35c9b7ba34814ea9d3e398bd23..e6a32c4e40402ec8cb7ed1d29158988ec07f1353 100644 (file)
@@ -257,9 +257,6 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
         * resulting in visible flicker. To mitigate the issue only update the
         * association if needed by enabled planes. Planes being disabled will
         * keep their current association.
-        *
-        * To mitigate the issue further we could pre-associate planes with
-        * CRTCs, either with a fixed 4/4 split, or through a module parameter.
         */
        mutex_lock(&rcrtc->group->lock);
 
index fec5f4d794daa1c3dacb2ef4b8dbcc72c9bf4fba..20859aae882e71869d7cb11bcffee657fa29da89 100644 (file)
@@ -765,10 +765,11 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
                rgrp->index = i;
                rgrp->num_crtcs = min(rcdu->num_crtcs - 2 * i, 2U);
 
-               /* Pre-associate all hardware planes with the first CRTC in the
-                * group.
+               /* If we have more than one CRTCs in this group pre-associate
+                * planes 0-3 with CRTC 0 and planes 4-7 with CRTC 1 to minimize
+                * flicker occurring when the association is changed.
                 */
-               rgrp->dptsr_planes = 0;
+               rgrp->dptsr_planes = rgrp->num_crtcs > 1 ? 0xf0 : 0;
 
                ret = rcar_du_planes_init(rgrp);
                if (ret < 0)