On Wed, 23 Mar 2022, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Apart from the EDID and VBT based mechanism we also sometimes > use the encoder's current mode as the panel fixed mode. We > currently have the same code for that duplicated in two places. > Let's unify. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_dvo.c | 30 +++++----------------- > drivers/gpu/drm/i915/display/intel_lvds.c | 7 +---- > drivers/gpu/drm/i915/display/intel_panel.c | 20 +++++++++++++++ > drivers/gpu/drm/i915/display/intel_panel.h | 4 +++ > 4 files changed, 31 insertions(+), 30 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c > index 90e026cef6ee..8c98897d8313 100644 > --- a/drivers/gpu/drm/i915/display/intel_dvo.c > +++ b/drivers/gpu/drm/i915/display/intel_dvo.c > @@ -378,27 +378,6 @@ static const struct drm_encoder_funcs intel_dvo_enc_funcs = { > .destroy = intel_dvo_enc_destroy, > }; > > -/* > - * Attempts to get a fixed panel timing for LVDS (currently only the i830). > - * > - * Other chips with DVO LVDS will need to extend this to deal with the LVDS > - * chip being on DVOB/C and having multiple pipes. > - */ > -static struct drm_display_mode * > -intel_dvo_get_current_mode(struct intel_encoder *encoder) > -{ > - struct drm_display_mode *mode; > - > - mode = intel_encoder_current_mode(encoder); > - if (mode) { > - DRM_DEBUG_KMS("using current (BIOS) mode: " DRM_MODE_FMT "\n", > - DRM_MODE_ARG(mode)); > - mode->type |= DRM_MODE_TYPE_PREFERRED; > - } > - > - return mode; > -} > - > static enum port intel_dvo_port(i915_reg_t dvo_reg) > { > if (i915_mmio_reg_equal(dvo_reg, DVOA)) > @@ -541,6 +520,8 @@ void intel_dvo_init(struct drm_i915_private *dev_priv) > > intel_connector_attach_encoder(intel_connector, intel_encoder); > if (dvo->type == INTEL_DVO_CHIP_LVDS) { > + struct drm_display_mode *fixed_mode; > + > /* > * For our LVDS chipsets, we should hopefully be able > * to dig the fixed panel mode out of the BIOS data. > @@ -549,9 +530,10 @@ void intel_dvo_init(struct drm_i915_private *dev_priv) > * headers, likely), so for now, just get the current > * mode being output through DVO. > */ > - intel_panel_init(intel_connector, > - intel_dvo_get_current_mode(intel_encoder), > - NULL); > + fixed_mode = intel_panel_encoder_fixed_mode(intel_connector, > + intel_encoder); > + > + intel_panel_init(intel_connector, fixed_mode, NULL); > intel_dvo->panel_wants_dither = true; > } > > diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c > index c3f017c3740c..5b2367bc3cd2 100644 > --- a/drivers/gpu/drm/i915/display/intel_lvds.c > +++ b/drivers/gpu/drm/i915/display/intel_lvds.c > @@ -983,12 +983,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv) > * on. If so, assume that whatever is currently programmed is the > * correct mode. > */ > - fixed_mode = intel_encoder_current_mode(intel_encoder); > - if (fixed_mode) { > - drm_dbg_kms(&dev_priv->drm, "using current (BIOS) mode: " DRM_MODE_FMT "\n", > - DRM_MODE_ARG(fixed_mode)); > - fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; > - } > + fixed_mode = intel_panel_encoder_fixed_mode(intel_connector, intel_encoder); > > /* If we still don't have a mode after all that, give up. */ > if (!fixed_mode) > diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c > index 7f59db8b9ede..882e424973d4 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.c > +++ b/drivers/gpu/drm/i915/display/intel_panel.c > @@ -292,6 +292,26 @@ intel_panel_vbt_sdvo_fixed_mode(struct intel_connector *connector) > return fixed_mode; > } > > +struct drm_display_mode * > +intel_panel_encoder_fixed_mode(struct intel_connector *connector, > + struct intel_encoder *encoder) > +{ > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > + struct drm_display_mode *fixed_mode; > + > + fixed_mode = intel_encoder_current_mode(encoder); > + if (!fixed_mode) > + return NULL; > + > + drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] using current (BIOS) mode: " DRM_MODE_FMT "\n", > + connector->base.base.id, connector->base.name, > + DRM_MODE_ARG(fixed_mode)); > + > + fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; > + > + return fixed_mode; > +} > + > /* adjusted_mode has been preset to be the panel's fixed mode */ > static int pch_panel_fitting(struct intel_crtc_state *crtc_state, > const struct drm_connector_state *conn_state) > diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h > index 7e32c903a1e6..6a6ac338e9aa 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.h > +++ b/drivers/gpu/drm/i915/display/intel_panel.h > @@ -16,6 +16,7 @@ struct drm_display_mode; > struct drm_i915_private; > struct intel_connector; > struct intel_crtc_state; > +struct intel_encoder; > > int intel_panel_init(struct intel_connector *connector, > struct drm_display_mode *fixed_mode, > @@ -50,5 +51,8 @@ struct drm_display_mode * > intel_panel_vbt_lfp_fixed_mode(struct intel_connector *connector); > struct drm_display_mode * > intel_panel_vbt_sdvo_fixed_mode(struct intel_connector *connector); > +struct drm_display_mode * > +intel_panel_encoder_fixed_mode(struct intel_connector *connector, > + struct intel_encoder *encoder); > > #endif /* __INTEL_PANEL_H__ */ -- Jani Nikula, Intel Open Source Graphics Center