|
@@ -963,30 +963,32 @@ static bool intel_sdvo_write_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,
|
|
|
- .ver = DIP_VERSION_AVI,
|
|
|
- .len = DIP_LEN_AVI,
|
|
|
- };
|
|
|
- uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
|
|
|
- struct intel_crtc *intel_crtc = to_intel_crtc(intel_sdvo->base.base.crtc);
|
|
|
+ uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)];
|
|
|
+ struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
|
|
|
+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
|
+ union hdmi_infoframe frame;
|
|
|
+ int ret;
|
|
|
+ ssize_t len;
|
|
|
+
|
|
|
+ ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
|
|
|
+ adjusted_mode);
|
|
|
+ if (ret < 0) {
|
|
|
+ DRM_ERROR("couldn't fill AVI infoframe\n");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
if (intel_sdvo->rgb_quant_range_selectable) {
|
|
|
if (intel_crtc->config.limited_color_range)
|
|
|
- avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED;
|
|
|
+ frame.avi.quantization_range =
|
|
|
+ HDMI_QUANTIZATION_RANGE_LIMITED;
|
|
|
else
|
|
|
- avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
|
|
|
+ frame.avi.quantization_range =
|
|
|
+ HDMI_QUANTIZATION_RANGE_FULL;
|
|
|
}
|
|
|
|
|
|
- avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
|
|
|
-
|
|
|
- intel_dip_infoframe_csum(&avi_if);
|
|
|
-
|
|
|
- /* sdvo spec says that the ecc is handled by the hw, and it looks like
|
|
|
- * we must not send the ecc field, either. */
|
|
|
- memcpy(sdvo_data, &avi_if, 3);
|
|
|
- sdvo_data[3] = avi_if.checksum;
|
|
|
- memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
|
|
|
+ len = hdmi_infoframe_pack(&frame, sdvo_data, sizeof(sdvo_data));
|
|
|
+ if (len < 0)
|
|
|
+ return false;
|
|
|
|
|
|
return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
|
|
|
SDVO_HBUF_TX_VSYNC,
|