[Intel-gfx] [PATCH 1/3] drm/i915: don't block resume on fb console resume
Rodrigo Vivi
rodrigo.vivi at gmail.com
Tue Oct 30 17:58:00 CET 2012
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
On Fri, Oct 26, 2012 at 3:08 PM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> The console lock can be contended, so rather than prevent other drivers
> after us from being held up, queue the console suspend into the global
> work queue that can happen anytime. I've measured this to take around
> 200ms on my T420. Combined with the ring freq/turbo change, we should
> save almost 1/2 a second on resume.
>
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/i915_dma.c | 3 +++
> drivers/gpu/drm/i915/i915_drv.c | 17 ++++++++++++++---
> drivers/gpu/drm/i915/i915_drv.h | 7 +++++++
> 3 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index d04facb..14526dc 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -1329,6 +1329,8 @@ static int i915_load_modeset_init(struct drm_device *dev)
>
> intel_modeset_gem_init(dev);
>
> + INIT_WORK(&dev_priv->console_resume_work, intel_console_resume);
> +
> ret = drm_irq_install(dev);
> if (ret)
> goto cleanup_gem;
> @@ -1723,6 +1725,7 @@ int i915_driver_unload(struct drm_device *dev)
> if (drm_core_check_feature(dev, DRIVER_MODESET)) {
> intel_fbdev_fini(dev);
> intel_modeset_cleanup(dev);
> + cancel_work_sync(&dev_priv->console_resume_work);
>
> /*
> * free the memory space allocated for the child device
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 59dc481..6d1fb51 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -519,6 +519,18 @@ int i915_suspend(struct drm_device *dev, pm_message_t state)
> return 0;
> }
>
> +void intel_console_resume(struct work_struct *work)
> +{
> + struct drm_i915_private *dev_priv =
> + container_of(work, struct drm_i915_private,
> + console_resume_work);
> + struct drm_device *dev = dev_priv->dev;
> +
> + console_lock();
> + intel_fbdev_set_suspend(dev, 0);
> + console_unlock();
> +}
> +
> static int i915_drm_thaw(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -555,9 +567,8 @@ static int i915_drm_thaw(struct drm_device *dev)
>
> dev_priv->modeset_on_lid = 0;
>
> - console_lock();
> - intel_fbdev_set_suspend(dev, 0);
> - console_unlock();
> + schedule_work(&dev_priv->console_resume_work);
> +
> return error;
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 2fcf284..a5b0456 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -453,6 +453,12 @@ typedef struct drm_i915_private {
> u32 hotplug_supported_mask;
> struct work_struct hotplug_work;
>
> + /*
> + * The console may be contended at resume, but we don't
> + * want it to block on it.
> + */
> + struct work_struct console_resume_work;
> +
> int num_pipe;
> int num_pch_pll;
>
> @@ -1253,6 +1259,7 @@ extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
> extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
> extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
>
> +extern void intel_console_resume(struct work_struct *work);
>
> /* i915_irq.c */
> void i915_hangcheck_elapsed(unsigned long data);
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
More information about the Intel-gfx
mailing list