[Intel-gfx] [DRM/I915]: Restore the modeset for every activated CRTC

Jesse Barnes jbarnes at virtuousgeek.org
Wed Jul 8 04:17:12 CEST 2009


On Wed, 08 Jul 2009 10:01:47 +0800
yakui <yakui.zhao at intel.com> wrote:

> On Wed, 2009-07-08 at 09:29 +0800, Jesse Barnes wrote:
> > On Wed, 08 Jul 2009 09:25:44 +0800
> > yakui <yakui.zhao at intel.com> wrote:
> > 
> > > On Wed, 2009-07-08 at 02:40 +0800, Eric Anholt wrote:
> > > > On Thu, 2009-07-02 at 15:16 +0800, yakui.zhao at intel.com wrote:
> > > > > From: Zhao Yakui <yakui.zhao at intel.com>
> > > > > 
> > > > > Restore the modeset for every activated CRTC in course of
> > > > > resume. This is realized by calling the function of
> > > > > drm_helper_resume_force_mode. Note: it is meaningful only for
> > > > > the KMS mode.
> > > > > 
> > > > > Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> > > > > ---
> > > > >  drivers/gpu/drm/i915/i915_drv.c |    5 +++++
> > > > >  1 file changed, 5 insertions(+)
> > > > > 
> > > > > Index: linux-2.6/drivers/gpu/drm/i915/i915_drv.c
> > > > > ===================================================================
> > > > > --- linux-2.6.orig/drivers/gpu/drm/i915/i915_drv.c
> > > > > 2009-07-02 14:24:44.000000000 +0800 +++
> > > > > linux-2.6/drivers/gpu/drm/i915/i915_drv.c	2009-07-02
> > > > > 14:25:52.000000000 +0800 @@ -35,6 +35,7 @@ 
> > > > >  #include "drm_pciids.h"
> > > > >  #include <linux/console.h>
> > > > > +#include "drm_crtc_helper.h"
> > > > >  
> > > > >  static unsigned int i915_modeset = -1;
> > > > >  module_param_named(modeset, i915_modeset, int, 0400);
> > > > > @@ -115,6 +116,10 @@
> > > > >  
> > > > >  		drm_irq_install(dev);
> > > > >  	}
> > > > > +	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
> > > > > +		/* Resume the modeset for every activated
> > > > > CRTC */
> > > > > +		drm_helper_resume_force_mode(dev);
> > > > > +	}
> > > > >  
> > > > >  	return ret;
> > > > >  }
> > > > 
> > > > So, this patch does a full modeset on top of the almost-full
> > > > modeset done by the suspend/resume code.  That seems bogus --
> > > > if we're going to do this, we shouldn't do the rest of the
> > > > save/restore for mdoesetting.
> > > In course of suspend we will save some registers related with
> > > modesetting. Of course the registers related with interrupt/vga
> > > are also saved.
> > > And in course of resume we will restore the registers.
> > > After doing so, many boxes can work well.
> > > But if the modesetting registers are touched by BIOS in course of
> > > suspend/resume, maybe it is not enough to only restore the
> > > registers related with modesetting. It will be better that we
> > > restore the full modeset for the activated crtc. 
> > > And when the system is resumed from S4, the registers related with
> > > modesetting are not initialized correctly. In such case it will be
> > > better that we restore the modeset.
> > 
> > Right, we want to do the mode set.  But we don't want to touch the
> > mode setting regs twice at resume time (the current resume function
> > basically does mode sets on each output, since it restores the
> > previous config).
> > 
> > So your patch should split the suspend & resume functions into code
> > that executes in a non-KMS config and code that executes in a KMS
> > config.  In the non-KMS case, we'll need to save/restore everything,
> > like we do currently.  In the non-KMS case we only need to
> > save/restore certain global chip state.  Anything that the existing
> > mode set functions set doesn't have to be saved & restored, since
> > the resume mode set will take care of it.
> > Doing it that way will speed up suspend/resume and reduce flicker.
> What you said is right. 
> We can remove the registers related with the modesetting in
> save/restore if it works in KMS mode.
> 
> But it seems that we can do it in another patch.

I'd rather see one patch that splits the KMS and non-KMS suspend
paths.  Or at least 2 patches in this series (so we apply them both
at the same time).

> > > This patch has no side effect for the box that can work well after
> > > using save/restore. And it can assure that the modeset before
> > > entering suspended state is restored correctly.
> > > 
> > > If the patch can be shipped, we can remove the register related
> > > with modesetting in save/restore when it works in KMS mode. In
> > > fact it doesn't matter if the we don't remove them. The side
> > > effect is that some registers are restored twice.
> > > > However, note that drm_helper_resume_force_mode doesn't turn off
> > > > disabled connectors, which seems wrong.
> > > the drm_helper_resume_force_mode doesn't touch the disabled
> > > connectors. Why is it necessary to turn off the disabled
> > > connectors again?
> > 
> > Two main reasons: one is that it restores the actual config of the
> > machine prior to suspend, and the other is that it helps save power.
> > If you resume your machine and an extra, unused pipe is turned on,
> > your battery will drain faster.
> Understand what you are concerned.
> This is to assure that the unused connectors are turned off if they
> are turned on by BIOS.
> 
> IMO it will be ok to call the function of
> drm_helper_disable_unused_function.

Yeah, Dave suggested doing that in the force routine itself.  I think
radeon also uses it so that would be a good place to share code.

-- 
Jesse Barnes, Intel Open Source Technology Center



More information about the Intel-gfx mailing list