diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 32 | 
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d9956278a56..1492706ed08 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -764,6 +764,18 @@ intel_dp_mode_fixup(struct drm_encoder *encoder,  	bpp = adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; +	if (intel_dp->color_range_auto) { +		/* +		 * See: +		 * CEA-861-E - 5.1 Default Encoding Parameters +		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry +		 */ +		if (bpp != 18 && drm_mode_cea_vic(adjusted_mode) > 1) +			intel_dp->color_range = DP_COLOR_RANGE_16_235; +		else +			intel_dp->color_range = 0; +	} +  	if (intel_dp->color_range)  		adjusted_mode->private_flags |= INTEL_MODE_LIMITED_COLOR_RANGE; @@ -2462,10 +2474,21 @@ intel_dp_set_property(struct drm_connector *connector,  	}  	if (property == dev_priv->broadcast_rgb_property) { -		if (val == !!intel_dp->color_range) -			return 0; - -		intel_dp->color_range = val ? DP_COLOR_RANGE_16_235 : 0; +		switch (val) { +		case INTEL_BROADCAST_RGB_AUTO: +			intel_dp->color_range_auto = true; +			break; +		case INTEL_BROADCAST_RGB_FULL: +			intel_dp->color_range_auto = false; +			intel_dp->color_range = 0; +			break; +		case INTEL_BROADCAST_RGB_LIMITED: +			intel_dp->color_range_auto = false; +			intel_dp->color_range = DP_COLOR_RANGE_16_235; +			break; +		default: +			return -EINVAL; +		}  		goto done;  	} @@ -2606,6 +2629,7 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect  	intel_attach_force_audio_property(connector);  	intel_attach_broadcast_rgb_property(connector); +	intel_dp->color_range_auto = true;  	if (is_edp(intel_dp)) {  		drm_mode_create_scaling_mode_property(connector->dev);  |