diff mbox

[1/7] drm/i915: Clean up DP/HDMI limited color range handling

Message ID 1436184606-18729-2-git-send-email-ville.syrjala@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ville Syrjälä July 6, 2015, 12:10 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Currently we treat intel_{dp,hdmi}->color_range as partly user
controller value (via the property) but we also change it during
.compute_config() when using the "Automatic" mode. That is a bit
confusing, so let's just change things so that we store the user
property values in intel_dp, and only change what's stored in
pipe_config during .compute_config().

There should be no functional change.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c   | 25 ++++++++++++-------------
 drivers/gpu/drm/i915/intel_drv.h  |  4 ++--
 drivers/gpu/drm/i915/intel_hdmi.c | 26 ++++++++++++--------------
 3 files changed, 26 insertions(+), 29 deletions(-)

Comments

Sivakumar Thulasimani Aug. 13, 2015, 6:16 a.m. UTC | #1
sdvo is still using color_range name in it's functions. would be good to
rename that as well along with dp & hdmi done here.

otherwise changes are fine
Reviewed-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>

On Monday 06 July 2015 05:40 PM, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Currently we treat intel_{dp,hdmi}->color_range as partly user
> controller value (via the property) but we also change it during
> .compute_config() when using the "Automatic" mode. That is a bit
> confusing, so let's just change things so that we store the user
> property values in intel_dp, and only change what's stored in
> pipe_config during .compute_config().
>
> There should be no functional change.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>   drivers/gpu/drm/i915/intel_dp.c   | 25 ++++++++++++-------------
>   drivers/gpu/drm/i915/intel_drv.h  |  4 ++--
>   drivers/gpu/drm/i915/intel_hdmi.c | 26 ++++++++++++--------------
>   3 files changed, 26 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index fcc64e5..decefa1 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -1455,15 +1455,13 @@ found:
>   		 * CEA-861-E - 5.1 Default Encoding Parameters
>   		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
>   		 */
> -		if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
> -			intel_dp->color_range = DP_COLOR_RANGE_16_235;
> -		else
> -			intel_dp->color_range = 0;
> +		pipe_config->limited_color_range =
> +			bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1;
> +	} else {
> +		pipe_config->limited_color_range =
> +			intel_dp->limited_color_range;
>   	}
>   
> -	if (intel_dp->color_range)
> -		pipe_config->limited_color_range = true;
> -
>   	intel_dp->lane_count = lane_count;
>   
>   	if (intel_dp->num_sink_rates) {
> @@ -1605,8 +1603,9 @@ static void intel_dp_prepare(struct intel_encoder *encoder)
>   			trans_dp &= ~TRANS_DP_ENH_FRAMING;
>   		I915_WRITE(TRANS_DP_CTL(crtc->pipe), trans_dp);
>   	} else {
> -		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
> -			intel_dp->DP |= intel_dp->color_range;
> +		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
> +		    crtc->config->limited_color_range)
> +			intel_dp->DP |= DP_COLOR_RANGE_16_235;
>   
>   		if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
>   			intel_dp->DP |= DP_SYNC_HS_HIGH;
> @@ -4663,7 +4662,7 @@ intel_dp_set_property(struct drm_connector *connector,
>   
>   	if (property == dev_priv->broadcast_rgb_property) {
>   		bool old_auto = intel_dp->color_range_auto;
> -		uint32_t old_range = intel_dp->color_range;
> +		bool old_range = intel_dp->limited_color_range;
>   
>   		switch (val) {
>   		case INTEL_BROADCAST_RGB_AUTO:
> @@ -4671,18 +4670,18 @@ intel_dp_set_property(struct drm_connector *connector,
>   			break;
>   		case INTEL_BROADCAST_RGB_FULL:
>   			intel_dp->color_range_auto = false;
> -			intel_dp->color_range = 0;
> +			intel_dp->limited_color_range = false;
>   			break;
>   		case INTEL_BROADCAST_RGB_LIMITED:
>   			intel_dp->color_range_auto = false;
> -			intel_dp->color_range = DP_COLOR_RANGE_16_235;
> +			intel_dp->limited_color_range = true;
>   			break;
>   		default:
>   			return -EINVAL;
>   		}
>   
>   		if (old_auto == intel_dp->color_range_auto &&
> -		    old_range == intel_dp->color_range)
> +		    old_range == intel_dp->limited_color_range)
>   			return 0;
>   
>   		goto done;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 3f0a890..983a7a7 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -669,7 +669,7 @@ struct cxsr_latency {
>   struct intel_hdmi {
>   	u32 hdmi_reg;
>   	int ddc_bus;
> -	uint32_t color_range;
> +	bool limited_color_range;
>   	bool color_range_auto;
>   	bool has_hdmi_sink;
>   	bool has_audio;
> @@ -714,7 +714,7 @@ struct intel_dp {
>   	uint32_t DP;
>   	bool has_audio;
>   	enum hdmi_force_audio force_audio;
> -	uint32_t color_range;
> +	bool limited_color_range;
>   	bool color_range_auto;
>   	uint8_t link_bw;
>   	uint8_t rate_select;
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index c7e912b..ba845f7 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -848,8 +848,8 @@ static void intel_hdmi_prepare(struct intel_encoder *encoder)
>   	u32 hdmi_val;
>   
>   	hdmi_val = SDVO_ENCODING_HDMI;
> -	if (!HAS_PCH_SPLIT(dev))
> -		hdmi_val |= intel_hdmi->color_range;
> +	if (!HAS_PCH_SPLIT(dev) && crtc->config->limited_color_range)
> +		hdmi_val |= HDMI_COLOR_RANGE_16_235;
>   	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
>   		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
>   	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
> @@ -1257,11 +1257,12 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
>   
>   	if (intel_hdmi->color_range_auto) {
>   		/* See CEA-861-E - 5.1 Default Encoding Parameters */
> -		if (pipe_config->has_hdmi_sink &&
> -		    drm_match_cea_mode(adjusted_mode) > 1)
> -			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
> -		else
> -			intel_hdmi->color_range = 0;
> +		pipe_config->limited_color_range =
> +			pipe_config->has_hdmi_sink &&
> +			drm_match_cea_mode(adjusted_mode) > 1;
> +	} else {
> +		pipe_config->limited_color_range =
> +			intel_hdmi->limited_color_range;
>   	}
>   
>   	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
> @@ -1270,9 +1271,6 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
>   		clock_12bpc *= 2;
>   	}
>   
> -	if (intel_hdmi->color_range)
> -		pipe_config->limited_color_range = true;
> -
>   	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
>   		pipe_config->has_pch_encoder = true;
>   
> @@ -1467,7 +1465,7 @@ intel_hdmi_set_property(struct drm_connector *connector,
>   
>   	if (property == dev_priv->broadcast_rgb_property) {
>   		bool old_auto = intel_hdmi->color_range_auto;
> -		uint32_t old_range = intel_hdmi->color_range;
> +		bool old_range = intel_hdmi->limited_color_range;
>   
>   		switch (val) {
>   		case INTEL_BROADCAST_RGB_AUTO:
> @@ -1475,18 +1473,18 @@ intel_hdmi_set_property(struct drm_connector *connector,
>   			break;
>   		case INTEL_BROADCAST_RGB_FULL:
>   			intel_hdmi->color_range_auto = false;
> -			intel_hdmi->color_range = 0;
> +			intel_hdmi->limited_color_range = false;
>   			break;
>   		case INTEL_BROADCAST_RGB_LIMITED:
>   			intel_hdmi->color_range_auto = false;
> -			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
> +			intel_hdmi->limited_color_range = true;
>   			break;
>   		default:
>   			return -EINVAL;
>   		}
>   
>   		if (old_auto == intel_hdmi->color_range_auto &&
> -		    old_range == intel_hdmi->color_range)
> +		    old_range == intel_hdmi->limited_color_range)
>   			return 0;
>   
>   		goto done;
Ville Syrjälä Aug. 13, 2015, 12:01 p.m. UTC | #2
On Thu, Aug 13, 2015 at 11:46:56AM +0530, Sivakumar Thulasimani wrote:
> sdvo is still using color_range name in it's functions. would be good to
> rename that as well along with dp & hdmi done here.

Doh. I forgot about sdvo completely. I'll take a look to make sure it
conforms to the same style. Thanks for spotting it.

> 
> otherwise changes are fine
> Reviewed-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>
> 
> On Monday 06 July 2015 05:40 PM, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Currently we treat intel_{dp,hdmi}->color_range as partly user
> > controller value (via the property) but we also change it during
> > .compute_config() when using the "Automatic" mode. That is a bit
> > confusing, so let's just change things so that we store the user
> > property values in intel_dp, and only change what's stored in
> > pipe_config during .compute_config().
> >
> > There should be no functional change.
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> >   drivers/gpu/drm/i915/intel_dp.c   | 25 ++++++++++++-------------
> >   drivers/gpu/drm/i915/intel_drv.h  |  4 ++--
> >   drivers/gpu/drm/i915/intel_hdmi.c | 26 ++++++++++++--------------
> >   3 files changed, 26 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> > index fcc64e5..decefa1 100644
> > --- a/drivers/gpu/drm/i915/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > @@ -1455,15 +1455,13 @@ found:
> >   		 * CEA-861-E - 5.1 Default Encoding Parameters
> >   		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
> >   		 */
> > -		if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
> > -			intel_dp->color_range = DP_COLOR_RANGE_16_235;
> > -		else
> > -			intel_dp->color_range = 0;
> > +		pipe_config->limited_color_range =
> > +			bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1;
> > +	} else {
> > +		pipe_config->limited_color_range =
> > +			intel_dp->limited_color_range;
> >   	}
> >   
> > -	if (intel_dp->color_range)
> > -		pipe_config->limited_color_range = true;
> > -
> >   	intel_dp->lane_count = lane_count;
> >   
> >   	if (intel_dp->num_sink_rates) {
> > @@ -1605,8 +1603,9 @@ static void intel_dp_prepare(struct intel_encoder *encoder)
> >   			trans_dp &= ~TRANS_DP_ENH_FRAMING;
> >   		I915_WRITE(TRANS_DP_CTL(crtc->pipe), trans_dp);
> >   	} else {
> > -		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
> > -			intel_dp->DP |= intel_dp->color_range;
> > +		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
> > +		    crtc->config->limited_color_range)
> > +			intel_dp->DP |= DP_COLOR_RANGE_16_235;
> >   
> >   		if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
> >   			intel_dp->DP |= DP_SYNC_HS_HIGH;
> > @@ -4663,7 +4662,7 @@ intel_dp_set_property(struct drm_connector *connector,
> >   
> >   	if (property == dev_priv->broadcast_rgb_property) {
> >   		bool old_auto = intel_dp->color_range_auto;
> > -		uint32_t old_range = intel_dp->color_range;
> > +		bool old_range = intel_dp->limited_color_range;
> >   
> >   		switch (val) {
> >   		case INTEL_BROADCAST_RGB_AUTO:
> > @@ -4671,18 +4670,18 @@ intel_dp_set_property(struct drm_connector *connector,
> >   			break;
> >   		case INTEL_BROADCAST_RGB_FULL:
> >   			intel_dp->color_range_auto = false;
> > -			intel_dp->color_range = 0;
> > +			intel_dp->limited_color_range = false;
> >   			break;
> >   		case INTEL_BROADCAST_RGB_LIMITED:
> >   			intel_dp->color_range_auto = false;
> > -			intel_dp->color_range = DP_COLOR_RANGE_16_235;
> > +			intel_dp->limited_color_range = true;
> >   			break;
> >   		default:
> >   			return -EINVAL;
> >   		}
> >   
> >   		if (old_auto == intel_dp->color_range_auto &&
> > -		    old_range == intel_dp->color_range)
> > +		    old_range == intel_dp->limited_color_range)
> >   			return 0;
> >   
> >   		goto done;
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 3f0a890..983a7a7 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -669,7 +669,7 @@ struct cxsr_latency {
> >   struct intel_hdmi {
> >   	u32 hdmi_reg;
> >   	int ddc_bus;
> > -	uint32_t color_range;
> > +	bool limited_color_range;
> >   	bool color_range_auto;
> >   	bool has_hdmi_sink;
> >   	bool has_audio;
> > @@ -714,7 +714,7 @@ struct intel_dp {
> >   	uint32_t DP;
> >   	bool has_audio;
> >   	enum hdmi_force_audio force_audio;
> > -	uint32_t color_range;
> > +	bool limited_color_range;
> >   	bool color_range_auto;
> >   	uint8_t link_bw;
> >   	uint8_t rate_select;
> > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> > index c7e912b..ba845f7 100644
> > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > @@ -848,8 +848,8 @@ static void intel_hdmi_prepare(struct intel_encoder *encoder)
> >   	u32 hdmi_val;
> >   
> >   	hdmi_val = SDVO_ENCODING_HDMI;
> > -	if (!HAS_PCH_SPLIT(dev))
> > -		hdmi_val |= intel_hdmi->color_range;
> > +	if (!HAS_PCH_SPLIT(dev) && crtc->config->limited_color_range)
> > +		hdmi_val |= HDMI_COLOR_RANGE_16_235;
> >   	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
> >   		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
> >   	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
> > @@ -1257,11 +1257,12 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
> >   
> >   	if (intel_hdmi->color_range_auto) {
> >   		/* See CEA-861-E - 5.1 Default Encoding Parameters */
> > -		if (pipe_config->has_hdmi_sink &&
> > -		    drm_match_cea_mode(adjusted_mode) > 1)
> > -			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
> > -		else
> > -			intel_hdmi->color_range = 0;
> > +		pipe_config->limited_color_range =
> > +			pipe_config->has_hdmi_sink &&
> > +			drm_match_cea_mode(adjusted_mode) > 1;
> > +	} else {
> > +		pipe_config->limited_color_range =
> > +			intel_hdmi->limited_color_range;
> >   	}
> >   
> >   	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
> > @@ -1270,9 +1271,6 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
> >   		clock_12bpc *= 2;
> >   	}
> >   
> > -	if (intel_hdmi->color_range)
> > -		pipe_config->limited_color_range = true;
> > -
> >   	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
> >   		pipe_config->has_pch_encoder = true;
> >   
> > @@ -1467,7 +1465,7 @@ intel_hdmi_set_property(struct drm_connector *connector,
> >   
> >   	if (property == dev_priv->broadcast_rgb_property) {
> >   		bool old_auto = intel_hdmi->color_range_auto;
> > -		uint32_t old_range = intel_hdmi->color_range;
> > +		bool old_range = intel_hdmi->limited_color_range;
> >   
> >   		switch (val) {
> >   		case INTEL_BROADCAST_RGB_AUTO:
> > @@ -1475,18 +1473,18 @@ intel_hdmi_set_property(struct drm_connector *connector,
> >   			break;
> >   		case INTEL_BROADCAST_RGB_FULL:
> >   			intel_hdmi->color_range_auto = false;
> > -			intel_hdmi->color_range = 0;
> > +			intel_hdmi->limited_color_range = false;
> >   			break;
> >   		case INTEL_BROADCAST_RGB_LIMITED:
> >   			intel_hdmi->color_range_auto = false;
> > -			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
> > +			intel_hdmi->limited_color_range = true;
> >   			break;
> >   		default:
> >   			return -EINVAL;
> >   		}
> >   
> >   		if (old_auto == intel_hdmi->color_range_auto &&
> > -		    old_range == intel_hdmi->color_range)
> > +		    old_range == intel_hdmi->limited_color_range)
> >   			return 0;
> >   
> >   		goto done;
> 
> -- 
> regards,
> Sivakumar Thulasimani
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index fcc64e5..decefa1 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1455,15 +1455,13 @@  found:
 		 * CEA-861-E - 5.1 Default Encoding Parameters
 		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
 		 */
-		if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
-			intel_dp->color_range = DP_COLOR_RANGE_16_235;
-		else
-			intel_dp->color_range = 0;
+		pipe_config->limited_color_range =
+			bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1;
+	} else {
+		pipe_config->limited_color_range =
+			intel_dp->limited_color_range;
 	}
 
-	if (intel_dp->color_range)
-		pipe_config->limited_color_range = true;
-
 	intel_dp->lane_count = lane_count;
 
 	if (intel_dp->num_sink_rates) {
@@ -1605,8 +1603,9 @@  static void intel_dp_prepare(struct intel_encoder *encoder)
 			trans_dp &= ~TRANS_DP_ENH_FRAMING;
 		I915_WRITE(TRANS_DP_CTL(crtc->pipe), trans_dp);
 	} else {
-		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
-			intel_dp->DP |= intel_dp->color_range;
+		if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
+		    crtc->config->limited_color_range)
+			intel_dp->DP |= DP_COLOR_RANGE_16_235;
 
 		if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
 			intel_dp->DP |= DP_SYNC_HS_HIGH;
@@ -4663,7 +4662,7 @@  intel_dp_set_property(struct drm_connector *connector,
 
 	if (property == dev_priv->broadcast_rgb_property) {
 		bool old_auto = intel_dp->color_range_auto;
-		uint32_t old_range = intel_dp->color_range;
+		bool old_range = intel_dp->limited_color_range;
 
 		switch (val) {
 		case INTEL_BROADCAST_RGB_AUTO:
@@ -4671,18 +4670,18 @@  intel_dp_set_property(struct drm_connector *connector,
 			break;
 		case INTEL_BROADCAST_RGB_FULL:
 			intel_dp->color_range_auto = false;
-			intel_dp->color_range = 0;
+			intel_dp->limited_color_range = false;
 			break;
 		case INTEL_BROADCAST_RGB_LIMITED:
 			intel_dp->color_range_auto = false;
-			intel_dp->color_range = DP_COLOR_RANGE_16_235;
+			intel_dp->limited_color_range = true;
 			break;
 		default:
 			return -EINVAL;
 		}
 
 		if (old_auto == intel_dp->color_range_auto &&
-		    old_range == intel_dp->color_range)
+		    old_range == intel_dp->limited_color_range)
 			return 0;
 
 		goto done;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 3f0a890..983a7a7 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -669,7 +669,7 @@  struct cxsr_latency {
 struct intel_hdmi {
 	u32 hdmi_reg;
 	int ddc_bus;
-	uint32_t color_range;
+	bool limited_color_range;
 	bool color_range_auto;
 	bool has_hdmi_sink;
 	bool has_audio;
@@ -714,7 +714,7 @@  struct intel_dp {
 	uint32_t DP;
 	bool has_audio;
 	enum hdmi_force_audio force_audio;
-	uint32_t color_range;
+	bool limited_color_range;
 	bool color_range_auto;
 	uint8_t link_bw;
 	uint8_t rate_select;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index c7e912b..ba845f7 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -848,8 +848,8 @@  static void intel_hdmi_prepare(struct intel_encoder *encoder)
 	u32 hdmi_val;
 
 	hdmi_val = SDVO_ENCODING_HDMI;
-	if (!HAS_PCH_SPLIT(dev))
-		hdmi_val |= intel_hdmi->color_range;
+	if (!HAS_PCH_SPLIT(dev) && crtc->config->limited_color_range)
+		hdmi_val |= HDMI_COLOR_RANGE_16_235;
 	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
 		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
 	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
@@ -1257,11 +1257,12 @@  bool intel_hdmi_compute_config(struct intel_encoder *encoder,
 
 	if (intel_hdmi->color_range_auto) {
 		/* See CEA-861-E - 5.1 Default Encoding Parameters */
-		if (pipe_config->has_hdmi_sink &&
-		    drm_match_cea_mode(adjusted_mode) > 1)
-			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
-		else
-			intel_hdmi->color_range = 0;
+		pipe_config->limited_color_range =
+			pipe_config->has_hdmi_sink &&
+			drm_match_cea_mode(adjusted_mode) > 1;
+	} else {
+		pipe_config->limited_color_range =
+			intel_hdmi->limited_color_range;
 	}
 
 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
@@ -1270,9 +1271,6 @@  bool intel_hdmi_compute_config(struct intel_encoder *encoder,
 		clock_12bpc *= 2;
 	}
 
-	if (intel_hdmi->color_range)
-		pipe_config->limited_color_range = true;
-
 	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
 		pipe_config->has_pch_encoder = true;
 
@@ -1467,7 +1465,7 @@  intel_hdmi_set_property(struct drm_connector *connector,
 
 	if (property == dev_priv->broadcast_rgb_property) {
 		bool old_auto = intel_hdmi->color_range_auto;
-		uint32_t old_range = intel_hdmi->color_range;
+		bool old_range = intel_hdmi->limited_color_range;
 
 		switch (val) {
 		case INTEL_BROADCAST_RGB_AUTO:
@@ -1475,18 +1473,18 @@  intel_hdmi_set_property(struct drm_connector *connector,
 			break;
 		case INTEL_BROADCAST_RGB_FULL:
 			intel_hdmi->color_range_auto = false;
-			intel_hdmi->color_range = 0;
+			intel_hdmi->limited_color_range = false;
 			break;
 		case INTEL_BROADCAST_RGB_LIMITED:
 			intel_hdmi->color_range_auto = false;
-			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
+			intel_hdmi->limited_color_range = true;
 			break;
 		default:
 			return -EINVAL;
 		}
 
 		if (old_auto == intel_hdmi->color_range_auto &&
-		    old_range == intel_hdmi->color_range)
+		    old_range == intel_hdmi->limited_color_range)
 			return 0;
 
 		goto done;