Hi 2012/11/26 Daniel Vetter <daniel.vetter at ffwll.ch>: > Yeah, all users (both the clock selection special cases and the lvds > pin pair stuff) are still in common code, but this will change. > > v2: Rebase on top of Jani Nikula's panel rework. > > v3: Incorporate review from Paulo Zanoni: > - s/__is_dual_link_lvds/compute_is_dual_link_lvds > - kill dev_priv->lvds_val > - drop spurious whitespace change > > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 - > drivers/gpu/drm/i915/intel_lvds.c | 42 +++++++++++++++++++++++++++------------ > 2 files changed, 29 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 3229f04..2e92617 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -704,7 +704,6 @@ typedef struct drm_i915_private { > unsigned int display_clock_mode:1; > int lvds_ssc_freq; > unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ > - unsigned int lvds_val; /* used for checking LVDS channel mode */ > struct { > int rate; > int lanes; > diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c > index 84255d0..1090f1b 100644 > --- a/drivers/gpu/drm/i915/intel_lvds.c > +++ b/drivers/gpu/drm/i915/intel_lvds.c > @@ -52,6 +52,7 @@ struct intel_lvds_encoder { > u32 pfit_control; > u32 pfit_pgm_ratios; > bool pfit_dirty; > + bool is_dual_link; > > struct intel_lvds_connector *attached_connector; > }; > @@ -920,6 +921,23 @@ static const struct dmi_system_id intel_dual_link_lvds[] = { > > bool intel_is_dual_link_lvds(struct drm_device *dev) > { > + struct intel_encoder *encoder; > + struct intel_lvds_encoder *lvds_encoder; > + > + list_for_each_entry(encoder, &dev->mode_config.encoder_list, > + base.head) { > + if (encoder->type == INTEL_OUTPUT_LVDS) { > + lvds_encoder = to_lvds_encoder(&encoder->base); > + > + return lvds_encoder->is_dual_link; > + } > + } > + > + return false; > +} > + > +static bool compute_is_dual_link_lvds(struct drm_device *dev) > +{ > unsigned int val; > struct drm_i915_private *dev_priv = dev->dev_private; > u32 lvds_reg; > @@ -937,19 +955,15 @@ bool intel_is_dual_link_lvds(struct drm_device *dev) > if (dmi_check_system(intel_dual_link_lvds)) > return true; > > - if (dev_priv->lvds_val) > - val = dev_priv->lvds_val; > - else { > - /* BIOS should set the proper LVDS register value at boot, but > - * in reality, it doesn't set the value when the lid is closed; > - * we need to check "the value to be set" in VBT when LVDS > - * register is uninitialized. > - */ > - val = I915_READ(lvds_reg); > - if (!(val & ~(LVDS_PIPE_MASK | LVDS_DETECTED))) > - val = dev_priv->bios_lvds_val; > - dev_priv->lvds_val = val; > - } > + /* BIOS should set the proper LVDS register value at boot, but > + * in reality, it doesn't set the value when the lid is closed; > + * we need to check "the value to be set" in VBT when LVDS > + * register is uninitialized. > + */ > + val = I915_READ(lvds_reg); > + if (!(val & ~(LVDS_PIPE_MASK | LVDS_DETECTED))) > + val = dev_priv->bios_lvds_val; > + > return (val & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP; > } > > @@ -1148,6 +1162,8 @@ bool intel_lvds_init(struct drm_device *dev) > goto failed; > > out: > + lvds_encoder->is_dual_link = compute_is_dual_link_lvds(dev); > + <bikeshedding> Here we could try to add some debug message telling whether we found dual-link LVDS or not. I don't know how useful it would be, but I added it to test your patches on my machine (I was not really sure whether it supported dual-link LVDS or not). Something like: + if (lvds_encoder->is_dual_link) + DRM_DEBUG_KMS("Dual link LVDS found\n"); </bikeshedding> Still, the patch looks correct, so with or without the debug message: Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com> > /* > * Unlock registers and just > * leave them unlocked > -- > 1.7.11.7 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Paulo Zanoni