On Tue, Oct 30, 2018 at 01:56:30PM +0200, Jani Nikula wrote: > From: Madhav Chauhan <madhav.chauhan@xxxxxxxxx> > > This patch read out the current hw state for DSI and > return true if encoder is active. > > v2 by Jani: > - Squash connector get hw state hook here > - Squash encode get hw state fix here > > Signed-off-by: Madhav Chauhan <madhav.chauhan@xxxxxxxxx> > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/icl_dsi.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/drivers/gpu/drm/i915/icl_dsi.c b/drivers/gpu/drm/i915/icl_dsi.c > index 83612c444eab..0c1f84cca16e 100644 > --- a/drivers/gpu/drm/i915/icl_dsi.c > +++ b/drivers/gpu/drm/i915/icl_dsi.c > @@ -1067,6 +1067,46 @@ static void gen11_dsi_get_config(struct intel_encoder *encoder, > pipe_config->port_clock = pixel_clk; > } > > +static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder, > + enum pipe *pipe) > +{ > + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > + struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); > + u32 tmp; > + enum port port; > + enum transcoder dsi_trans; > + bool ret = false; > + > + if (!intel_display_power_get_if_enabled(dev_priv, > + encoder->power_domain)) > + return false; > + > + for_each_dsi_port(port, intel_dsi->ports) { > + dsi_trans = dsi_port_to_transcoder(port); > + tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans)); > + switch (tmp & TRANS_DDI_EDP_INPUT_MASK) { > + case TRANS_DDI_EDP_INPUT_A_ON: > + *pipe = PIPE_A; > + break; > + case TRANS_DDI_EDP_INPUT_B_ONOFF: > + *pipe = PIPE_B; > + break; > + case TRANS_DDI_EDP_INPUT_C_ONOFF: > + *pipe = PIPE_C; > + break; > + default: > + DRM_ERROR("Invalid PIPE input\n"); > + goto out; > + } > + > + tmp = I915_READ(PIPECONF(dsi_trans)); > + ret = tmp & PIPECONF_ENABLE; > + } > +out: > + intel_display_power_put(dev_priv, encoder->power_domain); > + return ret; > +} > + > static void gen11_dsi_encoder_destroy(struct drm_encoder *encoder) > { > intel_encoder_destroy(encoder); > @@ -1166,6 +1206,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) > encoder->disable = gen11_dsi_disable; > encoder->port = port; > encoder->get_config = gen11_dsi_get_config; > + encoder->get_hw_state = gen11_dsi_get_hw_state; Since the encoder enable hook gets a power domain reference, we have to make sure we take this reference during HW readout, if the encoder was enabled. That can be done by defining the encoder->get_power_domains hook returning those references, similarly to intel_ddi_get_power_domains(). > encoder->type = INTEL_OUTPUT_DSI; > encoder->cloneable = 0; > encoder->crtc_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C); > @@ -1177,6 +1218,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv) > connector->display_info.subpixel_order = SubPixelHorizontalRGB; > connector->interlace_allowed = false; > connector->doublescan_allowed = false; > + intel_connector->get_hw_state = intel_connector_get_hw_state; > > /* attach connector to encoder */ > intel_connector_attach_encoder(intel_connector, encoder); > -- > 2.11.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx