From: Paulo Zanoni <paulo.r.zan...@intel.com>

We need this since now on DDI we will have 2 connectors on each
encoder.

Signed-off-by: Paulo Zanoni <paulo.r.zan...@intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c  | 40 +++++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_dp.c   |  6 +++++-
 drivers/gpu/drm/i915/intel_drv.h  |  1 +
 drivers/gpu/drm/i915/intel_hdmi.c |  5 ++++-
 4 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index a8eda96..58a529d 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1023,6 +1023,46 @@ void intel_ddi_disable_transcoder_func(struct 
drm_i915_private *dev_priv,
        I915_WRITE(reg, val);
 }
 
+bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
+{
+       struct drm_device *dev = intel_connector->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_encoder *intel_encoder = intel_connector->encoder;
+       int type = intel_connector->base.connector_type;
+       enum port port = intel_ddi_get_encoder_port(intel_encoder);
+       enum pipe pipe = 0;
+       enum transcoder cpu_transcoder;
+       uint32_t tmp;
+
+       if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
+               return false;
+
+       if (port == PORT_A)
+               cpu_transcoder = TRANSCODER_EDP;
+       else
+               cpu_transcoder = pipe;
+
+       tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
+
+       switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
+       case TRANS_DDI_MODE_SELECT_HDMI:
+       case TRANS_DDI_MODE_SELECT_DVI:
+               return (type == DRM_MODE_CONNECTOR_HDMIA);
+
+       case TRANS_DDI_MODE_SELECT_DP_SST:
+               if (type == DRM_MODE_CONNECTOR_eDP)
+                       return true;
+       case TRANS_DDI_MODE_SELECT_DP_MST:
+               return (type == DRM_MODE_CONNECTOR_DisplayPort);
+
+       case TRANS_DDI_MODE_SELECT_FDI:
+               return (type == DRM_MODE_CONNECTOR_VGA);
+
+       default:
+               return false;
+       }
+}
+
 bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
                            enum pipe *pipe)
 {
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index b89d935..66bff2d 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2739,7 +2739,11 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_dig_port,
        intel_connector_attach_encoder(intel_connector, intel_encoder);
        drm_sysfs_connector_add(connector);
 
-       intel_connector->get_hw_state = intel_connector_get_hw_state;
+       if (IS_HASWELL(dev))
+               intel_connector->get_hw_state = 
intel_ddi_connector_get_hw_state;
+       else
+               intel_connector->get_hw_state = intel_connector_get_hw_state;
+
 
        /* Set up the DDC bus. */
        switch (port) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 42f16c7..0a527729 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -652,5 +652,6 @@ extern void intel_ddi_post_disable(struct intel_encoder 
*intel_encoder);
 extern void intel_ddi_put_crtc_pll(struct drm_crtc *crtc);
 extern void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
 extern void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder);
+bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
 
 #endif /* __INTEL_DRV_H__ */
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 3c42caa..79d15b3 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1017,7 +1017,10 @@ static void intel_hdmi_init_connector(struct 
intel_digital_port *intel_dig_port,
                intel_hdmi->set_infoframes = cpt_set_infoframes;
        }
 
-       intel_connector->get_hw_state = intel_connector_get_hw_state;
+       if (IS_HASWELL(dev))
+               intel_connector->get_hw_state = 
intel_ddi_connector_get_hw_state;
+       else
+               intel_connector->get_hw_state = intel_connector_get_hw_state;
 
        intel_hdmi_add_properties(intel_hdmi, connector);
 
-- 
1.7.11.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to