drm: rcar-du: Reject modes that fail CRTC timing requirements
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Sun, 11 Nov 2018 02:15:08 +0000 (04:15 +0200)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 23 Nov 2018 11:51:23 +0000 (13:51 +0200)
The hardware requires the HDSR and VDSR registers to be set to 1 or
higher. This translates to a minimum combined horizontal sync and back
porch of 20 pixels and a minimum vertical back porch of 3 lines. Reject
modes that fail those requirements.

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

index 79021d7aa3cec20d106743ba6372197ff87ea89a..90dacab67be5a8629525ed30665d58b93eeb2878 100644 (file)
@@ -735,10 +735,22 @@ enum drm_mode_status rcar_du_crtc_mode_valid(struct drm_crtc *crtc,
        struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
        struct rcar_du_device *rcdu = rcrtc->group->dev;
        bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
+       unsigned int vbp;
 
        if (interlaced && !rcar_du_has(rcdu, RCAR_DU_FEATURE_INTERLACED))
                return MODE_NO_INTERLACE;
 
+       /*
+        * The hardware requires a minimum combined horizontal sync and back
+        * porch of 20 pixels and a minimum vertical back porch of 3 lines.
+        */
+       if (mode->htotal - mode->hsync_start < 20)
+               return MODE_HBLANK_NARROW;
+
+       vbp = (mode->vtotal - mode->vsync_end) / (interlaced ? 2 : 1);
+       if (vbp < 3)
+               return MODE_VBLANK_NARROW;
+
        return MODE_OK;
 }