From: Ville Syrjälä <ville.syrj...@linux.intel.com>

As with regular HDMI encoders, let's precompute the infoframes
(actually just AVI infoframe for the time being) with SDVO HDMI
encoders.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_sdvo.c | 58 +++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c 
b/drivers/gpu/drm/i915/intel_sdvo.c
index 701372e512a8..d8c78aebaf01 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -981,33 +981,57 @@ 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,
-                                        const struct intel_crtc_state 
*pipe_config)
+static bool intel_sdvo_compute_avi_infoframe(struct intel_sdvo *intel_sdvo,
+                                            struct intel_crtc_state 
*crtc_state,
+                                            struct drm_connector_state 
*conn_state)
 {
-       uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)];
-       union hdmi_infoframe frame;
+       struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
        int ret;
-       ssize_t len;
 
-       ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
-                                                      
&pipe_config->base.adjusted_mode,
+       if (!crtc_state->has_hdmi_sink)
+               return true;
+
+       crtc_state->infoframes.enable |=
+               intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
+
+       ret = drm_hdmi_avi_infoframe_from_display_mode(frame,
+                                                      
&crtc_state->base.adjusted_mode,
                                                       false);
-       if (ret < 0) {
-               DRM_ERROR("couldn't fill AVI infoframe\n");
+       if (WARN_ON(ret))
                return false;
-       }
 
        if (intel_sdvo->rgb_quant_range_selectable) {
-               if (pipe_config->limited_color_range)
-                       frame.avi.quantization_range =
+               if (crtc_state->limited_color_range)
+                       frame->quantization_range =
                                HDMI_QUANTIZATION_RANGE_LIMITED;
                else
-                       frame.avi.quantization_range =
+                       frame->quantization_range =
                                HDMI_QUANTIZATION_RANGE_FULL;
        }
 
-       len = hdmi_infoframe_pack(&frame, sdvo_data, sizeof(sdvo_data));
-       if (len < 0)
+       ret = hdmi_avi_infoframe_check(frame);
+       if (WARN_ON(ret))
+               return false;
+
+       return true;
+}
+
+static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
+                                        const struct intel_crtc_state 
*crtc_state)
+{
+       u8 sdvo_data[HDMI_INFOFRAME_SIZE(AVI)];
+       const union hdmi_infoframe *frame = &crtc_state->infoframes.avi;
+       ssize_t len;
+
+       if ((crtc_state->infoframes.enable &
+            intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI)) == 0)
+               return true;
+
+       if (WARN_ON(frame->any.type != HDMI_INFOFRAME_TYPE_AVI))
+               return false;
+
+       len = hdmi_infoframe_pack_only(frame, sdvo_data, sizeof(sdvo_data));
+       if (WARN_ON(len < 0))
                return false;
 
        return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
@@ -1194,6 +1218,10 @@ static bool intel_sdvo_compute_config(struct 
intel_encoder *encoder,
        if (intel_sdvo_connector->is_hdmi)
                adjusted_mode->picture_aspect_ratio = 
conn_state->picture_aspect_ratio;
 
+       if (!intel_sdvo_compute_avi_infoframe(intel_sdvo,
+                                             pipe_config, conn_state))
+               return false;
+
        return true;
 }
 
-- 
2.16.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to