drm: rcar-du: Fix Alpha blending issue on Gen3
authorLUU HOAI <hoai.luu.ub@renesas.com>
Tue, 26 Apr 2022 08:41:57 +0000 (09:41 +0100)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Thu, 7 Jul 2022 02:24:36 +0000 (05:24 +0300)
As per R-Car-Gen3_Common_OPC_Customer_Notifications_V30.1.pdf,
unexpected image output(such as incorrect colors or planes being
invisible) can happen on the below conditions, as PnALPHAR register
is not initialized by reset.

When alpha blending (PpMRm.PpSPIM=0b101) is performed and:
•two Planes are enabled on any DUn (n=0,1,2,3)
oDSPRn= 0x0000 0031 or 0x0000 0013
•or DU0 and DU1 is used for display at the same time
oDSPR0= 0x0000 0001 and DSPR1= 0x0000 0003
oDSPR0= 0x0000 0003 and DSPR1= 0x0000 0001
•or DU2 and DU3(H3 Only) is used for display at the same time
oDSPR2= 0x0000 0001 and DSPR3= 0x0000 0003
oDSPR2= 0x0000 0003 and DSPR3= 0x0000 0001

This patch set PnALPHAR register to 0 to avoid this issue.

Signed-off-by: LUU HOAI <hoai.luu.ub@renesas.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
drivers/gpu/drm/rcar-du/rcar_du_plane.c

index 9a9bc8b..501d793 100644 (file)
@@ -512,6 +512,18 @@ static void rcar_du_plane_setup_format_gen3(struct rcar_du_group *rgrp,
 
        rcar_du_plane_write(rgrp, index, PnDDCR4,
                            state->format->edf | PnDDCR4_CODE);
+
+       /*
+        * On Gen3, some DU channels have two planes, each being wired to a
+        * separate VSPD instance. The DU can then blend two planes. While
+        * this feature isn't used by the driver, issues related to alpha
+        * blending (such as incorrect colors or planes being invisible) may
+        * still occur if the PnALPHAR register has a stale value. Set the
+        * register to 0 to avoid this.
+        */
+
+       /* TODO: Check if alpha-blending should be disabled in PnMR. */
+       rcar_du_plane_write(rgrp, index, PnALPHAR, 0);
 }
 
 static void rcar_du_plane_setup_format(struct rcar_du_group *rgrp,