|
@@ -126,6 +126,7 @@ struct intel_sdvo {
|
|
|
bool is_hdmi;
|
|
|
bool has_hdmi_monitor;
|
|
|
bool has_hdmi_audio;
|
|
|
+ bool rgb_quant_range_selectable;
|
|
|
|
|
|
/**
|
|
|
* This is set if we detect output of sdvo device as LVDS and
|
|
@@ -947,7 +948,8 @@ static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo,
|
|
|
&tx_rate, 1);
|
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
|
|
|
+static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
|
|
|
+ const struct drm_display_mode *adjusted_mode)
|
|
|
{
|
|
|
struct dip_infoframe avi_if = {
|
|
|
.type = DIP_TYPE_AVI,
|
|
@@ -956,6 +958,13 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
|
|
|
};
|
|
|
uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
|
|
|
|
|
|
+ if (intel_sdvo->rgb_quant_range_selectable) {
|
|
|
+ if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE)
|
|
|
+ avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED;
|
|
|
+ else
|
|
|
+ avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
|
|
|
+ }
|
|
|
+
|
|
|
intel_dip_infoframe_csum(&avi_if);
|
|
|
|
|
|
/* sdvo spec says that the ecc is handled by the hw, and it looks like
|
|
@@ -1134,7 +1143,7 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
|
intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI);
|
|
|
intel_sdvo_set_colorimetry(intel_sdvo,
|
|
|
SDVO_COLORIMETRY_RGB256);
|
|
|
- intel_sdvo_set_avi_infoframe(intel_sdvo);
|
|
|
+ intel_sdvo_set_avi_infoframe(intel_sdvo, adjusted_mode);
|
|
|
} else
|
|
|
intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI);
|
|
|
|
|
@@ -1526,6 +1535,8 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
|
|
|
if (intel_sdvo->is_hdmi) {
|
|
|
intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
|
|
|
intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
|
|
|
+ intel_sdvo->rgb_quant_range_selectable =
|
|
|
+ drm_rgb_quant_range_selectable(edid);
|
|
|
}
|
|
|
} else
|
|
|
status = connector_status_disconnected;
|
|
@@ -1577,6 +1588,7 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
|
|
|
|
|
|
intel_sdvo->has_hdmi_monitor = false;
|
|
|
intel_sdvo->has_hdmi_audio = false;
|
|
|
+ intel_sdvo->rgb_quant_range_selectable = false;
|
|
|
|
|
|
if ((intel_sdvo_connector->output_flag & response) == 0)
|
|
|
ret = connector_status_disconnected;
|