Message ID | 1302499397-11051-1-git-send-email-airlied@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 11 Apr 2011 15:23:17 +1000, Dave Airlie <airlied@gmail.com> wrote: > From: Dave Airlie <airlied@redhat.com> > > This has always used a big hammer, but that hammer is probably > too big, I'm also not sure its necessary but at least this > should be safe. So the difference appears to be that the patch only restores the fbcon of a device for the lastclose of that device. That makes sense. However, would it not be better to make this a generic drm_fb_helper_restore_mode() as it sounds like something every driver should consider? -Chris
On Mon, 11 Apr 2011 15:23:17 +1000, Dave Airlie <airlied@gmail.com> wrote: > From: Dave Airlie <airlied@redhat.com> > > This has always used a big hammer, but that hammer is probably > too big, I'm also not sure its necessary but at least this > should be safe. Am I correct in reading the drm_fb_helper_restore path as restoring the mode of each fbdev device in turn? If so, why would that ever be useful (aside from doing it for each inserted card)?
On Mon, 11 Apr 2011 09:06:38 -0700, Keith Packard <keithp@keithp.com> wrote: > On Mon, 11 Apr 2011 15:23:17 +1000, Dave Airlie <airlied@gmail.com> wrote: > > From: Dave Airlie <airlied@redhat.com> > > > > This has always used a big hammer, but that hammer is probably > > too big, I'm also not sure its necessary but at least this > > should be safe. > > Am I correct in reading the drm_fb_helper_restore path as restoring > the mode of each fbdev device in turn? If so, why would that ever be > useful (aside from doing it for each inserted card)? During panics? Just not lastclose. :) -Chris
On Mon, 11 Apr 2011 18:31:21 +0100, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> During panics? Just not lastclose. :)
I'm still mystified -- why is it useful to do more than one modesetting
operation on the video card?
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 7273037..12876f2 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -2207,7 +2207,7 @@ void i915_driver_lastclose(struct drm_device * dev) drm_i915_private_t *dev_priv = dev->dev_private; if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { - drm_fb_helper_restore(); + intel_fb_restore_mode(dev); vga_switcheroo_process_delayed_switch(); return; } diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index f5b0d83..1d20712 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -338,4 +338,5 @@ extern int intel_overlay_attrs(struct drm_device *dev, void *data, struct drm_file *file_priv); extern void intel_fb_output_poll_changed(struct drm_device *dev); +extern void intel_fb_restore_mode(struct drm_device *dev); #endif /* __INTEL_DRV_H__ */ diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 5127827..96a45c4 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c @@ -264,3 +264,19 @@ void intel_fb_output_poll_changed(struct drm_device *dev) drm_i915_private_t *dev_priv = dev->dev_private; drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper); } + +void intel_fb_restore_mode(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = dev->dev_private; + int ret, i; + + if (!dev_priv->fbdev) + return; + + for (i = 0; i < dev_priv->fbdev->helper.crtc_count; i++) { + struct drm_mode_set *mode_set = &dev_priv->fbdev->helper.crtc_info[i].mode_set; + ret = drm_crtc_helper_set_config(mode_set); + if (ret) + DRM_DEBUG("failed to restore crtc mode\n"); + } +}