On Sat, Jul 3, 2010 at 3:48 AM, Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx> wrote: > We don't currently update the DPMS status of the connector (both in the > connector itself and the connector's DPMS property) in the fb helper > code. This means that if the kernel FB core has blanked the screen, > sysfs will still show a DPMS status of "on". It also means that when X > starts, it will try to light up the connectors, but the drm_crtc_helper > code will ignore the DPMS change since according to the connector, the > DPMS status is already on. > > Fixes https://bugs.freedesktop.org/show_bug.cgi?id=28436 (the annoying > "my screen was blanked when I started X and now it won't light up" bug). > Yay finally that is fixed, I apologies for not getting to it myself, sent to Linus. Dave. > Signed-off-by: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx> > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index b3779d2..32f67cb 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -315,8 +315,9 @@ static void drm_fb_helper_on(struct fb_info *info) > struct drm_device *dev = fb_helper->dev; > struct drm_crtc *crtc; > struct drm_crtc_helper_funcs *crtc_funcs; > + struct drm_connector *connector; > struct drm_encoder *encoder; > - int i; > + int i, j; > > /* > * For each CRTC in this fb, turn the crtc on then, > @@ -332,7 +333,14 @@ static void drm_fb_helper_on(struct fb_info *info) > > crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); > > - > + /* Walk the connectors & encoders on this fb turning them on */ > + for (j = 0; j < fb_helper->connector_count; j++) { > + connector = fb_helper->connector_info[j]->connector; > + connector->dpms = DRM_MODE_DPMS_ON; > + drm_connector_property_set_value(connector, > + dev->mode_config.dpms_property, > + DRM_MODE_DPMS_ON); > + } > /* Found a CRTC on this fb, now find encoders */ > list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { > if (encoder->crtc == crtc) { > @@ -352,8 +360,9 @@ static void drm_fb_helper_off(struct fb_info *info, int dpms_mode) > struct drm_device *dev = fb_helper->dev; > struct drm_crtc *crtc; > struct drm_crtc_helper_funcs *crtc_funcs; > + struct drm_connector *connector; > struct drm_encoder *encoder; > - int i; > + int i, j; > > /* > * For each CRTC in this fb, find all associated encoders > @@ -367,6 +376,14 @@ static void drm_fb_helper_off(struct fb_info *info, int dpms_mode) > if (!crtc->enabled) > continue; > > + /* Walk the connectors on this fb and mark them off */ > + for (j = 0; j < fb_helper->connector_count; j++) { > + connector = fb_helper->connector_info[j]->connector; > + connector->dpms = dpms_mode; > + drm_connector_property_set_value(connector, > + dev->mode_config.dpms_property, > + dpms_mode); > + } > /* Found a CRTC on this fb, now find encoders */ > list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { > if (encoder->crtc == crtc) { > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel