- Instead of touching the fragile recovery system when modesetting fails, the encoder is now defined as active when it has a connector. - Previously bad things happened with the same crtc, same connector, but different encoder, because encoder->crtc != NULL. - Also put a function in the header, which already had an exported symbol. --- drivers/gpu/drm/drm_crtc_helper.c | 23 +++++++++++++++++------ include/drm/drm_crtc_helper.h | 1 + 2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 9cd8451..86992e1 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -265,8 +265,11 @@ void drm_helper_disable_unused_functions(struct drm_device *dev) list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { encoder_funcs = encoder->helper_private; - if (!drm_helper_encoder_in_use(encoder)) + if (!drm_helper_encoder_in_use(encoder)) { + /* With encoder swapping the crtc can still be non-NULL. */ + encoder->crtc = NULL; (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); + } } list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { @@ -549,7 +552,7 @@ drm_crtc_prepare_encoders(struct drm_device *dev) list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { encoder_funcs = encoder->helper_private; /* Disable unused encoders */ - if (encoder->crtc == NULL) + if (!(drm_helper_encoder_in_use(encoder))) (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); /* Disable encoders whose CRTC is about to change */ if (encoder_funcs->get_crtc && @@ -611,7 +614,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, */ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - if (encoder->crtc != crtc) + /* For the sake of reversability encoder->crtc is NULL'ed later. + * Check to make sure the encoder is actually connected. */ + if (encoder->crtc != crtc || !drm_helper_encoder_in_use(encoder)) continue; encoder_funcs = encoder->helper_private; if (!(ret = encoder_funcs->mode_fixup(encoder, mode, @@ -627,7 +632,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, /* Prepare the encoders and CRTCs before setting the mode. */ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - if (encoder->crtc != crtc) + /* For the sake of reversability encoder->crtc is NULL'ed later. + * Check to make sure the encoder is actually connected. */ + if (encoder->crtc != crtc || !drm_helper_encoder_in_use(encoder)) continue; encoder_funcs = encoder->helper_private; /* Disable the encoders as the first thing we do. */ @@ -647,7 +654,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - if (encoder->crtc != crtc) + /* For the sake of reversability encoder->crtc is NULL'ed later. + * Check to make sure the encoder is actually connected. */ + if (encoder->crtc != crtc || !drm_helper_encoder_in_use(encoder)) continue; DRM_INFO("%s: set mode %s %x\n", drm_get_encoder_name(encoder), @@ -661,7 +670,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - if (encoder->crtc != crtc) + /* For the sake of reversability encoder->crtc is NULL'ed later. + * Check to make sure the encoder is actually connected. */ + if (encoder->crtc != crtc || !drm_helper_encoder_in_use(encoder)) continue; encoder_funcs = encoder->helper_private; diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index 6769ff6..e44a4f8 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h @@ -98,6 +98,7 @@ extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, int x, int y, struct drm_framebuffer *old_fb); extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); +extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); -- 1.6.4 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- _______________________________________________ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel