From: Shashank Sharma <shashank.sha...@intel.com>

SKL and BXT qualifies the HAS_DDI() check, and hence haswell
modeset functions are re-used for modeset sequence. But DDI
interface doesn't include support for DSI.
This patch adds:
1. cases for DSI encoder, in those modeset functions and allows
   a CRTC modeset
2. Adds call to pre_pll enabled from CRTC modeset function. Nothing
   needs to be done as such in CRTC for DSI encoder, as PLL, clock
   and and transcoder programming will be taken care in encoder's
   pre_enable and pre_pll_enable function.

v2: Fixed Jani's review comments. Added INVALID_PORT for non DDI
    encoder like DSI for platforms having HAS_DDI as true.

Signed-off-by: Shashank Sharma <shashank.sha...@intel.com>
Signed-off-by: Uma Shankar <uma.shan...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h       |    1 +
 drivers/gpu/drm/i915/intel_ddi.c      |   10 +++++++++-
 drivers/gpu/drm/i915/intel_display.c  |   19 ++++++++++++++-----
 drivers/gpu/drm/i915/intel_opregion.c |    3 ++-
 4 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 23ce125e..04f746d 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -142,6 +142,7 @@ enum plane {
 #define sprite_name(p, s) ((p) * INTEL_INFO(dev)->num_sprites[(p)] + (s) + 'A')
 
 enum port {
+       PORT_INVALID = -1,
        PORT_A = 0,
        PORT_B,
        PORT_C,
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 9a40bfb..2bad86e 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -310,6 +310,10 @@ static void ddi_get_encoder_port(struct intel_encoder 
*intel_encoder,
        } else if (type == INTEL_OUTPUT_ANALOG) {
                *dig_port = NULL;
                *port = PORT_E;
+       } else if (type == INTEL_OUTPUT_DSI) {
+               *dig_port = NULL;
+               *port = PORT_INVALID;
+               DRM_DEBUG_KMS("Encoder type: DSI. Returning...\n");
        } else {
                DRM_ERROR("Invalid DDI encoder type %d\n", type);
                BUG();
@@ -565,6 +569,9 @@ void intel_prepare_ddi(struct drm_device *dev)
 
                ddi_get_encoder_port(intel_encoder, &intel_dig_port, &port);
 
+               if (port == PORT_INVALID)
+                       continue;
+
                if (visited[port])
                        continue;
 
@@ -2052,7 +2059,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
 {
        struct drm_crtc *crtc = &intel_crtc->base;
-       struct drm_i915_private *dev_priv = crtc->dev->dev_private;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
        enum port port = intel_ddi_get_encoder_port(intel_encoder);
        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 52e21d4..db27995 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4904,6 +4904,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
        int pipe = intel_crtc->pipe, hsw_workaround_pipe;
+       bool is_dsi = intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DSI);
        struct intel_crtc_state *pipe_config =
                to_intel_crtc_state(crtc->state);
 
@@ -4945,7 +4946,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
                dev_priv->display.fdi_link_train(crtc);
        }
 
-       intel_ddi_enable_pipe_clock(intel_crtc);
+       if (!is_dsi)
+               intel_ddi_enable_pipe_clock(intel_crtc);
 
        if (INTEL_INFO(dev)->gen == 9)
                skylake_pfit_enable(intel_crtc);
@@ -4961,7 +4963,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        intel_crtc_load_lut(crtc);
 
        intel_ddi_set_pipe_settings(crtc);
-       intel_ddi_enable_transcoder_func(crtc);
+       if (!is_dsi)
+               intel_ddi_enable_transcoder_func(crtc);
 
        intel_update_watermarks(crtc);
        intel_enable_pipe(intel_crtc);
@@ -4969,13 +4972,16 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        if (intel_crtc->config->has_pch_encoder)
                lpt_pch_enable(crtc);
 
-       if (intel_crtc->config->dp_encoder_is_mst)
+       if (intel_crtc->config->dp_encoder_is_mst && !is_dsi)
                intel_ddi_set_vc_payload_alloc(crtc, true);
 
        assert_vblank_disabled(crtc);
        drm_crtc_vblank_on(crtc);
 
        for_each_encoder_on_crtc(dev, crtc, encoder) {
+               if (encoder->pre_pll_enable)
+                       encoder->pre_pll_enable(encoder);
+
                encoder->enable(encoder);
                intel_opregion_notify_encoder(encoder, true);
        }
@@ -5065,6 +5071,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
+       bool is_dsi = intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DSI);
 
        for_each_encoder_on_crtc(dev, crtc, encoder) {
                intel_opregion_notify_encoder(encoder, false);
@@ -5082,7 +5089,8 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
        if (intel_crtc->config->dp_encoder_is_mst)
                intel_ddi_set_vc_payload_alloc(crtc, false);
 
-       intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
+       if (!is_dsi)
+               intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
 
        if (INTEL_INFO(dev)->gen == 9)
                skylake_scaler_disable(intel_crtc);
@@ -5091,7 +5099,8 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
        else
                MISSING_CASE(INTEL_INFO(dev)->gen);
 
-       intel_ddi_disable_pipe_clock(intel_crtc);
+       if (!is_dsi)
+               intel_ddi_disable_pipe_clock(intel_crtc);
 
        if (intel_crtc->config->has_pch_encoder) {
                lpt_disable_pch_transcoder(dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_opregion.c 
b/drivers/gpu/drm/i915/intel_opregion.c
index cb1c657..8182f67 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -342,7 +342,7 @@ int intel_opregion_notify_encoder(struct intel_encoder 
*intel_encoder,
                return 0;
 
        port = intel_ddi_get_encoder_port(intel_encoder);
-       if (port == PORT_E) {
+       if ((port == PORT_E) || (port == PORT_INVALID)) {
                port = 0;
        } else {
                parm |= 1 << port;
@@ -363,6 +363,7 @@ int intel_opregion_notify_encoder(struct intel_encoder 
*intel_encoder,
                type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL;
                break;
        case INTEL_OUTPUT_EDP:
+       case INTEL_OUTPUT_DSI:
                type = DISPLAY_TYPE_INTERNAL_FLAT_PANEL;
                break;
        default:
-- 
1.7.9.5

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

Reply via email to