[PATCH v3 16/16] drm/ast: Only look up VBIOS mode on full modesets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Only look up the VBIOS mode during atomic_check if the display mode
changes. For page flips, the previous settings still apply. Avoids the
runtime overhead of looking up the VBIOS mode on each page flip.

Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx>
Reviewed-by: Jocelyn Falempe <jfalempe@xxxxxxxxxx>
---
 drivers/gpu/drm/ast/ast_mode.c | 52 ++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index a93994b00f40a..bd781293b6d97 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -996,32 +996,34 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
 	}
 
 	/*
-	 * Find the VBIOS mode and adjust the DRM display mode accordingly.
+	 * Find the VBIOS mode and adjust the DRM display mode accordingly
+	 * if a full modeset is required. Otherwise keep the existing values.
 	 */
-
-	vmode = ast_vbios_find_mode(ast, &crtc_state->mode);
-	if (!vmode)
-		return -EINVAL;
-	ast_state->vmode = vmode;
-
-	if (vmode->flags & HBorder)
-		hborder = 8;
-	if (vmode->flags & VBorder)
-		vborder = 8;
-
-	adjusted_mode->crtc_hdisplay = vmode->hde;
-	adjusted_mode->crtc_hblank_start = vmode->hde + hborder;
-	adjusted_mode->crtc_hblank_end = vmode->ht - hborder;
-	adjusted_mode->crtc_hsync_start = vmode->hde + hborder + vmode->hfp;
-	adjusted_mode->crtc_hsync_end = vmode->hde + hborder + vmode->hfp + vmode->hsync;
-	adjusted_mode->crtc_htotal = vmode->ht;
-
-	adjusted_mode->crtc_vdisplay = vmode->vde;
-	adjusted_mode->crtc_vblank_start = vmode->vde + vborder;
-	adjusted_mode->crtc_vblank_end = vmode->vt - vborder;
-	adjusted_mode->crtc_vsync_start = vmode->vde + vborder + vmode->vfp;
-	adjusted_mode->crtc_vsync_end = vmode->vde + vborder + vmode->vfp + vmode->vsync;
-	adjusted_mode->crtc_vtotal = vmode->vt;
+	if (drm_atomic_crtc_needs_modeset(crtc_state)) {
+		vmode = ast_vbios_find_mode(ast, &crtc_state->mode);
+		if (!vmode)
+			return -EINVAL;
+		ast_state->vmode = vmode;
+
+		if (vmode->flags & HBorder)
+			hborder = 8;
+		if (vmode->flags & VBorder)
+			vborder = 8;
+
+		adjusted_mode->crtc_hdisplay = vmode->hde;
+		adjusted_mode->crtc_hblank_start = vmode->hde + hborder;
+		adjusted_mode->crtc_hblank_end = vmode->ht - hborder;
+		adjusted_mode->crtc_hsync_start = vmode->hde + hborder + vmode->hfp;
+		adjusted_mode->crtc_hsync_end = vmode->hde + hborder + vmode->hfp + vmode->hsync;
+		adjusted_mode->crtc_htotal = vmode->ht;
+
+		adjusted_mode->crtc_vdisplay = vmode->vde;
+		adjusted_mode->crtc_vblank_start = vmode->vde + vborder;
+		adjusted_mode->crtc_vblank_end = vmode->vt - vborder;
+		adjusted_mode->crtc_vsync_start = vmode->vde + vborder + vmode->vfp;
+		adjusted_mode->crtc_vsync_end = vmode->vde + vborder + vmode->vfp + vmode->vsync;
+		adjusted_mode->crtc_vtotal = vmode->vt;
+	}
 
 	return 0;
 }
-- 
2.48.1




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux