Commit 7d4aefd0 authored by Shashank Sharma's avatar Shashank Sharma Committed by Daniel Vetter

drm/i915/bxt: DSI encoder support in CRTC modeset

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.

v3: Rebased on latest drm-nightly branch. Added a WARN_ON for invalid
    encoder.

v4: WARN_ON for invalid encoder is refactored as per Jani's suggestion.
    Fixed the sequence for pre_pll_enable.

v5: Protected DDI code paths in case of DSI encoder calls.
Signed-off-by: default avatarShashank Sharma <shashank.sharma@intel.com>
Signed-off-by: default avatarUma Shankar <uma.shankar@intel.com>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 13d70b81
...@@ -558,8 +558,10 @@ void intel_prepare_ddi(struct drm_device *dev) ...@@ -558,8 +558,10 @@ void intel_prepare_ddi(struct drm_device *dev)
enum port port; enum port port;
bool supports_hdmi; bool supports_hdmi;
ddi_get_encoder_port(intel_encoder, &intel_dig_port, &port); if (intel_encoder->type == INTEL_OUTPUT_DSI)
continue;
ddi_get_encoder_port(intel_encoder, &intel_dig_port, &port);
if (visited[port]) if (visited[port])
continue; continue;
...@@ -2043,7 +2045,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder, ...@@ -2043,7 +2045,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc) void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
{ {
struct drm_crtc *crtc = &intel_crtc->base; 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); struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
enum port port = intel_ddi_get_encoder_port(intel_encoder); enum port port = intel_ddi_get_encoder_port(intel_encoder);
enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
......
...@@ -4965,6 +4965,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc) ...@@ -4965,6 +4965,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
int pipe = intel_crtc->pipe, hsw_workaround_pipe; int pipe = intel_crtc->pipe, hsw_workaround_pipe;
struct intel_crtc_state *pipe_config = struct intel_crtc_state *pipe_config =
to_intel_crtc_state(crtc->state); to_intel_crtc_state(crtc->state);
bool is_dsi = intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DSI);
if (WARN_ON(intel_crtc->active)) if (WARN_ON(intel_crtc->active))
return; return;
...@@ -4994,9 +4995,12 @@ static void haswell_crtc_enable(struct drm_crtc *crtc) ...@@ -4994,9 +4995,12 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
intel_crtc->active = true; intel_crtc->active = true;
intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
for_each_encoder_on_crtc(dev, crtc, encoder) for_each_encoder_on_crtc(dev, crtc, encoder) {
if (encoder->pre_pll_enable)
encoder->pre_pll_enable(encoder);
if (encoder->pre_enable) if (encoder->pre_enable)
encoder->pre_enable(encoder); encoder->pre_enable(encoder);
}
if (intel_crtc->config->has_pch_encoder) { if (intel_crtc->config->has_pch_encoder) {
intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A, intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
...@@ -5004,7 +5008,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc) ...@@ -5004,7 +5008,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
dev_priv->display.fdi_link_train(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) if (INTEL_INFO(dev)->gen >= 9)
skylake_pfit_enable(intel_crtc); skylake_pfit_enable(intel_crtc);
...@@ -5018,7 +5023,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc) ...@@ -5018,7 +5023,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
intel_crtc_load_lut(crtc); intel_crtc_load_lut(crtc);
intel_ddi_set_pipe_settings(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_update_watermarks(crtc);
intel_enable_pipe(intel_crtc); intel_enable_pipe(intel_crtc);
...@@ -5026,7 +5032,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc) ...@@ -5026,7 +5032,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
if (intel_crtc->config->has_pch_encoder) if (intel_crtc->config->has_pch_encoder)
lpt_pch_enable(crtc); 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); intel_ddi_set_vc_payload_alloc(crtc, true);
assert_vblank_disabled(crtc); assert_vblank_disabled(crtc);
...@@ -5119,6 +5125,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc) ...@@ -5119,6 +5125,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
struct intel_encoder *encoder; struct intel_encoder *encoder;
enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 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) { for_each_encoder_on_crtc(dev, crtc, encoder) {
intel_opregion_notify_encoder(encoder, false); intel_opregion_notify_encoder(encoder, false);
...@@ -5136,14 +5143,16 @@ static void haswell_crtc_disable(struct drm_crtc *crtc) ...@@ -5136,14 +5143,16 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
if (intel_crtc->config->dp_encoder_is_mst) if (intel_crtc->config->dp_encoder_is_mst)
intel_ddi_set_vc_payload_alloc(crtc, false); 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) if (INTEL_INFO(dev)->gen >= 9)
skylake_scaler_disable(intel_crtc); skylake_scaler_disable(intel_crtc);
else else
ironlake_pfit_disable(intel_crtc, false); ironlake_pfit_disable(intel_crtc, false);
intel_ddi_disable_pipe_clock(intel_crtc); if (!is_dsi)
intel_ddi_disable_pipe_clock(intel_crtc);
if (intel_crtc->config->has_pch_encoder) { if (intel_crtc->config->has_pch_encoder) {
lpt_disable_pch_transcoder(dev_priv); lpt_disable_pch_transcoder(dev_priv);
......
...@@ -341,8 +341,12 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, ...@@ -341,8 +341,12 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
if (!HAS_DDI(dev)) if (!HAS_DDI(dev))
return 0; return 0;
port = intel_ddi_get_encoder_port(intel_encoder); if (intel_encoder->type == INTEL_OUTPUT_DSI)
if (port == PORT_E) { port = 0;
else
port = intel_ddi_get_encoder_port(intel_encoder);
if (port == PORT_E) {
port = 0; port = 0;
} else { } else {
parm |= 1 << port; parm |= 1 << port;
...@@ -363,6 +367,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, ...@@ -363,6 +367,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL; type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL;
break; break;
case INTEL_OUTPUT_EDP: case INTEL_OUTPUT_EDP:
case INTEL_OUTPUT_DSI:
type = DISPLAY_TYPE_INTERNAL_FLAT_PANEL; type = DISPLAY_TYPE_INTERNAL_FLAT_PANEL;
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment