Message ID | 648e4ccc5905fd977c69a8dbab0074b05bd56596.1352737835.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 12 Nov 2012 18:31:35 +0200, Jani Nikula <jani.nikula@intel.com> wrote: > Any failures in intel_sdvo_init() after the intel_sdvo_setup_output() call > left behind ghost connectors, attached (with a dangling pointer) to the > sdvo that has been cleaned up and freed. Properly destroy any connectors > attached to the encoder. > > Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=46381 > CC: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Jani Nikula <jani.nikula@intel.com> > > --- > > This is *completely* untested, and I don't really know if the connector > loop is okay or naïve in some way... Please review and test carefully. CC > Chris in case this addresses his SDVO EDID failures too. Sadly not. The issue in question, for readers at home, is that after commit 9cd300e038d492af4990b04e127e0bd2df64b1ca Author: Jani Nikula <jani.nikula@intel.com> Date: Fri Oct 19 14:51:52 2012 +0300 drm/i915: Move cached EDID to intel_connector Move the cached EDID from intel_dp and intel_lvds_connector to intel_connector. Unify cached EDID handling for LVDS and eDP, in preparation for adding more generic EDID caching later. I lose the EDID on a SDVO-LVDS device (an ilk dual LVDS and SDVO-LVDS Libretto W105). -Chris
On Mon, Nov 12, 2012 at 06:31:35PM +0200, Jani Nikula wrote: > Any failures in intel_sdvo_init() after the intel_sdvo_setup_output() call > left behind ghost connectors, attached (with a dangling pointer) to the > sdvo that has been cleaned up and freed. Properly destroy any connectors > attached to the encoder. > > Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=46381 > CC: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reporter says this works, tested-by&cc: stable added and merged. Thanks, Daniel
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 30f1752..6456427 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -2361,6 +2361,18 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags) return true; } +static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo) +{ + struct drm_device *dev = intel_sdvo->base.base.dev; + struct drm_connector *connector, *tmp; + + list_for_each_entry_safe(connector, tmp, + &dev->mode_config.connector_list, head) { + if (intel_attached_encoder(connector) == &intel_sdvo->base) + intel_sdvo_destroy(connector); + } +} + static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, struct intel_sdvo_connector *intel_sdvo_connector, int type) @@ -2682,7 +2694,7 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) intel_sdvo->caps.output_flags) != true) { DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", SDVO_NAME(intel_sdvo)); - goto err; + goto err_output; } /* Only enable the hotplug irq if we need it, to work around noisy @@ -2695,12 +2707,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) /* Set the input timing to the screen. Assume always input 0. */ if (!intel_sdvo_set_target_input(intel_sdvo)) - goto err; + goto err_output; if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, &intel_sdvo->pixel_clock_min, &intel_sdvo->pixel_clock_max)) - goto err; + goto err_output; DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " "clock range %dMHz - %dMHz, " @@ -2720,6 +2732,9 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); return true; +err_output: + intel_sdvo_output_cleanup(intel_sdvo); + err: drm_encoder_cleanup(&intel_encoder->base); i2c_del_adapter(&intel_sdvo->ddc);
Any failures in intel_sdvo_init() after the intel_sdvo_setup_output() call left behind ghost connectors, attached (with a dangling pointer) to the sdvo that has been cleaned up and freed. Properly destroy any connectors attached to the encoder. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=46381 CC: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- This is *completely* untested, and I don't really know if the connector loop is okay or naïve in some way... Please review and test carefully. CC Chris in case this addresses his SDVO EDID failures too. --- drivers/gpu/drm/i915/intel_sdvo.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)