diff options
author | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2018-11-10 21:15:08 -0500 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2018-11-23 06:51:23 -0500 |
commit | 256856efb8cc2b5468c69edf45eb0ab579833ce7 (patch) | |
tree | 255ab951272ed61859b9e3fa1aa1b232c24835c3 | |
parent | 63a298f22a6183b5b7536a203596c6570dfcfe8e (diff) |
drm: rcar-du: Reject modes that fail CRTC timing requirements
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>
-rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 79021d7aa3ce..90dacab67be5 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c | |||
@@ -735,10 +735,22 @@ enum drm_mode_status rcar_du_crtc_mode_valid(struct drm_crtc *crtc, | |||
735 | struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); | 735 | struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); |
736 | struct rcar_du_device *rcdu = rcrtc->group->dev; | 736 | struct rcar_du_device *rcdu = rcrtc->group->dev; |
737 | bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; | 737 | bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; |
738 | unsigned int vbp; | ||
738 | 739 | ||
739 | if (interlaced && !rcar_du_has(rcdu, RCAR_DU_FEATURE_INTERLACED)) | 740 | if (interlaced && !rcar_du_has(rcdu, RCAR_DU_FEATURE_INTERLACED)) |
740 | return MODE_NO_INTERLACE; | 741 | return MODE_NO_INTERLACE; |
741 | 742 | ||
743 | /* | ||
744 | * The hardware requires a minimum combined horizontal sync and back | ||
745 | * porch of 20 pixels and a minimum vertical back porch of 3 lines. | ||
746 | */ | ||
747 | if (mode->htotal - mode->hsync_start < 20) | ||
748 | return MODE_HBLANK_NARROW; | ||
749 | |||
750 | vbp = (mode->vtotal - mode->vsync_end) / (interlaced ? 2 : 1); | ||
751 | if (vbp < 3) | ||
752 | return MODE_VBLANK_NARROW; | ||
753 | |||
742 | return MODE_OK; | 754 | return MODE_OK; |
743 | } | 755 | } |
744 | 756 | ||