diff mbox series

[08/15] drm/i915/tv: Deobfuscate preferred mode selection

Message ID 20181112170000.27531-10-ville.syrjala@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: Fix TV encoder support | expand

Commit Message

Ville Syrjälä Nov. 12, 2018, 4:59 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Rewrite the preferred mode selection to just check
whether the TV modes is HD or SD. For SD TV modes we
favor 480 line modes, for 720p we prefer 720 line modes,
and for 1080i/p we prefer 1080 line modes.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_tv.c | 50 ++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 20 deletions(-)

Comments

Imre Deak Jan. 22, 2019, 2:43 p.m. UTC | #1
On Mon, Nov 12, 2018 at 06:59:53PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Rewrite the preferred mode selection to just check
> whether the TV modes is HD or SD. For SD TV modes we
> favor 480 line modes, for 720p we prefer 720 line modes,
> and for 1080i/p we prefer 1080 line modes.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Imre Deak <imre.deak@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_tv.c | 50 ++++++++++++++++++++-------------
>  1 file changed, 30 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
> index 97a82878359f..54189080cfb1 100644
> --- a/drivers/gpu/drm/i915/intel_tv.c
> +++ b/drivers/gpu/drm/i915/intel_tv.c
> @@ -860,6 +860,14 @@ intel_tv_mode_valid(struct drm_connector *connector,
>  	return MODE_CLOCK_RANGE;
>  }
>  
> +static int
> +intel_tv_mode_vdisplay(const struct tv_mode *tv_mode)
> +{
> +	if (tv_mode->progressive)
> +		return tv_mode->nbr_end + 1;
> +	else
> +		return 2 * (tv_mode->nbr_end + 1);
> +}
>  
>  static void
>  intel_tv_get_config(struct intel_encoder *encoder,
> @@ -1098,10 +1106,7 @@ static void intel_tv_pre_enable(struct intel_encoder *encoder,
>  	/* Filter ctl must be set before TV_WIN_SIZE */
>  	I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE);
>  	xsize = tv_mode->hblank_start - tv_mode->hblank_end;
> -	if (tv_mode->progressive)
> -		ysize = tv_mode->nbr_end + 1;
> -	else
> -		ysize = 2 * (tv_mode->nbr_end + 1);
> +	ysize = intel_tv_mode_vdisplay(tv_mode);
>  
>  	xpos = conn_state->tv.margins.left;
>  	ypos = conn_state->tv.margins.top;
> @@ -1320,22 +1325,28 @@ static const struct input_res {
>  	{"1920x1080", 1920, 1080},
>  };
>  
> -/*
> - * Chose preferred mode  according to line number of TV format
> - */
> +/* Choose preferred mode according to line number of TV format */
> +static bool
> +intel_tv_is_preferred_mode(const struct drm_display_mode *mode,
> +			   const struct tv_mode *tv_mode)
> +{
> +	int vdisplay = intel_tv_mode_vdisplay(tv_mode);
> +
> +	/* prefer 480 line modes for all SD TV modes */
> +	if (vdisplay <= 576)
> +		vdisplay = 480;
> +
> +	return vdisplay == mode->vdisplay;
> +}
> +
>  static void
> -intel_tv_choose_preferred_modes(const struct tv_mode *tv_mode,
> -			       struct drm_display_mode *mode_ptr)
> +intel_tv_set_mode_type(struct drm_display_mode *mode,
> +		       const struct tv_mode *tv_mode)
>  {
> -	if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
> -		mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
> -	else if (tv_mode->nbr_end > 480) {
> -		if (tv_mode->progressive == true && tv_mode->nbr_end < 720) {
> -			if (mode_ptr->vdisplay == 720)
> -				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
> -		} else if (mode_ptr->vdisplay == 1080)
> -				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
> -	}
> +	mode->type = DRM_MODE_TYPE_DRIVER;
> +
> +	if (intel_tv_is_preferred_mode(mode, tv_mode))
> +		mode->type |= DRM_MODE_TYPE_PREFERRED;
>  }
>  
>  static int
> @@ -1383,8 +1394,7 @@ intel_tv_get_modes(struct drm_connector *connector)
>  		tmp = div_u64(tmp, 1000000);
>  		mode_ptr->clock = (int) tmp;
>  
> -		mode_ptr->type = DRM_MODE_TYPE_DRIVER;
> -		intel_tv_choose_preferred_modes(tv_mode, mode_ptr);
> +		intel_tv_set_mode_type(mode_ptr, tv_mode);
>  		drm_mode_probed_add(connector, mode_ptr);
>  		count++;
>  	}
> -- 
> 2.18.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 97a82878359f..54189080cfb1 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -860,6 +860,14 @@  intel_tv_mode_valid(struct drm_connector *connector,
 	return MODE_CLOCK_RANGE;
 }
 
+static int
+intel_tv_mode_vdisplay(const struct tv_mode *tv_mode)
+{
+	if (tv_mode->progressive)
+		return tv_mode->nbr_end + 1;
+	else
+		return 2 * (tv_mode->nbr_end + 1);
+}
 
 static void
 intel_tv_get_config(struct intel_encoder *encoder,
@@ -1098,10 +1106,7 @@  static void intel_tv_pre_enable(struct intel_encoder *encoder,
 	/* Filter ctl must be set before TV_WIN_SIZE */
 	I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE);
 	xsize = tv_mode->hblank_start - tv_mode->hblank_end;
-	if (tv_mode->progressive)
-		ysize = tv_mode->nbr_end + 1;
-	else
-		ysize = 2 * (tv_mode->nbr_end + 1);
+	ysize = intel_tv_mode_vdisplay(tv_mode);
 
 	xpos = conn_state->tv.margins.left;
 	ypos = conn_state->tv.margins.top;
@@ -1320,22 +1325,28 @@  static const struct input_res {
 	{"1920x1080", 1920, 1080},
 };
 
-/*
- * Chose preferred mode  according to line number of TV format
- */
+/* Choose preferred mode according to line number of TV format */
+static bool
+intel_tv_is_preferred_mode(const struct drm_display_mode *mode,
+			   const struct tv_mode *tv_mode)
+{
+	int vdisplay = intel_tv_mode_vdisplay(tv_mode);
+
+	/* prefer 480 line modes for all SD TV modes */
+	if (vdisplay <= 576)
+		vdisplay = 480;
+
+	return vdisplay == mode->vdisplay;
+}
+
 static void
-intel_tv_choose_preferred_modes(const struct tv_mode *tv_mode,
-			       struct drm_display_mode *mode_ptr)
+intel_tv_set_mode_type(struct drm_display_mode *mode,
+		       const struct tv_mode *tv_mode)
 {
-	if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
-		mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-	else if (tv_mode->nbr_end > 480) {
-		if (tv_mode->progressive == true && tv_mode->nbr_end < 720) {
-			if (mode_ptr->vdisplay == 720)
-				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-		} else if (mode_ptr->vdisplay == 1080)
-				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-	}
+	mode->type = DRM_MODE_TYPE_DRIVER;
+
+	if (intel_tv_is_preferred_mode(mode, tv_mode))
+		mode->type |= DRM_MODE_TYPE_PREFERRED;
 }
 
 static int
@@ -1383,8 +1394,7 @@  intel_tv_get_modes(struct drm_connector *connector)
 		tmp = div_u64(tmp, 1000000);
 		mode_ptr->clock = (int) tmp;
 
-		mode_ptr->type = DRM_MODE_TYPE_DRIVER;
-		intel_tv_choose_preferred_modes(tv_mode, mode_ptr);
+		intel_tv_set_mode_type(mode_ptr, tv_mode);
 		drm_mode_probed_add(connector, mode_ptr);
 		count++;
 	}